file  显示文件内容类型
命令引用   file `cat /etc/shells`   可以用file命令执行后面的内容

ls  显示文件类型

cat 显示文件内容

#cat /etc/passwd
root  :x        :  0    :0    :root:/root:/bin/bash
用户名          用户ID  组ID
ls -ld
echo

**  修改虚拟机ip地址的方法:ifconfig eth0 地址
编程语言:

动态语言(脚本语言)
    变量不需要事先声明
    解释执行

编译--》执行

解释器:#!/bin/bash,

myseradd.sh

./myseradd.sh

bash myseradd.sh

shell,脚本编程语言 perl 语言,python 语言 完全面向对象,ruby 语言 完全面向对象

      网页开发的脚本语言 jsp php asp

静态语言(编译型语言)
    变量必须要声明,严格区分变量类型
    编译后才能执行

编辑--》编译--》连接--》执行

变量:命名的内存空间

变量类型:
    1、空间大小  2、数据的存储格式

   3字符和数值区别
  
存储为字符:8bit,
    为数据值:2bit
32444  字符  16bit
       数据  40bit
  
整数:1
浮点数:1.234=

bash:数据值型,字符型,不支持浮点

2/3,圆整


声明变量:

A=3

declare -i A=0   初始化声明

declare
   -i intrger
   -x

set A=3   设置变量
unset A   撤销变量

变量类别:
本地变量   set这种方式就是声明本地变量,在整个脚本里面都有效,不能扩展到其他脚本
环境变量   export声明环境变量=dechare -s
特殊变量
位置变量

变量用完之后怎么处理:

声明一个变量:"MYPATH=/tmp/scripts a"  此时加引号

如何引用变量:变量替换
$(MYPATH)
$MYPATH

ANIMAL=pig

There are some $(ANIMAL)S.

总结引号:引用
"":弱引用
'':强引用
``:命令替换

"$(ANIMAL)"  显示数值

'$(ANIMAL)'  原封不动显示字符串

`$(ANIMAL)`

变量名的使用法则:
只能包含字母、数字、下划线,但是不能以数字开头

echo $VAR

shell,subshell 子shell

cat /etc/passwd   用户账户信息

cat /etc/shells  查看可用shell

echo $PATH  显示环境变量


导出环境变量的方法:

先声明变量,而后使用export 导出
使用export直接导出

ANIMAL=pig
export ANIMAL(变量)

环境变量和本地变量作用范围不一样

CLI:
bash--》

用户工作环境配置文件:

全局配置:
/etc/profile配置文件,/etc/profile.d/*,/etc/bashrc

个人配置
.bash_profile,~/.bashrc

profile类:交互式登录,用户生效
  设置环境变量
  运行一些命令或脚本
 
bashrc类:非交互式登录用户
  设置本地变量
  定义命令别名

交互式登录用户执行配置文件的过程:
/etc/profile --> /etc/profile.d/* --> ~/.bashrc --> /etc/bashrc

越靠后,生效的优先级越高

非交互式登录:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*

alias 定义别名


#set      查看所有本地和环境变量
#export   查看所有声明过的环境变量
#printenv  查看所有声明过的环境变量

关键的环境变量:
display   定义显示的屏幕
lang      声明当前语言环境(语言的编码gb2312)
path      定义到哪些命令下执行
export PATH=/usr/local/apache/bin:$PATH
USER
SHELL
HOSTNAME  主机名


不是环境变量  PS1=   PS2  设置命令行中#前面显示内容

basename /usr/local/bin


~/.bash_profile

~/.bash_history

~/.bash_logout


输入/输出重定向和管道

标准输入,标准输出,标准错误输出,

STDIN      STDOUT      STDERR

  0           1           2

键盘        监视器     监视器

输入输出重定向:

输出重定向:
>:覆盖输出  定义输出重定向   把原有内容覆盖  定义标准输出
>>:追加输出  不覆盖原有内容

2>:覆盖错误输出
2>>:不覆盖错误输出

&>:混合输出重定向

ls /var > /tmp/var.out 2> /tmp/var.err

ls /var >> /tmp/var.out 2>> /tmp/var.err

set -C  不允许覆盖输出
set +C  允许覆盖输出

/dev/null  数据黑洞  

eg  ls /var
    ls /var >/tmp/var.out
    cat !$
   
管道:
把一个命令的输出当做另一个命令的输入

COMMAND1 | COMMAND2 | COMMAND3

**file命令不能接受cat传送过来的命令  cat /etc/shells | file
eg
ls -l /etc | less   把ls的输出当做less的输入    实现分页查看

tee  即显示  又输出

tr 'a-z' 'A-Z'   把小写字母全部换成大写字母

输入重定向
<

here document
<<
用于脚本当中生成一个文件使用。

<


EOF     表示结束

1 显示当前系统上第2块网卡eth1的IP地址,如果发生错误,则重定向至/dev/null
ifconfig eth1 2> /dev/null

2 显示/var/目录下的所有文件或子目录,但是要把所有字母换成大写
ls /var | tr 'a-z' 'A-Z'

3 以一个命令显示当前系统上所有可用shell对应的可执行文件的文件内容类型,并让结果以全大写的方式显示
file `cat /etc/shells` | tr 'a-z' 'A-Z'


文本处理:

文本过滤:
grep,egrep扩展的正则匹配,fgrep不支持正则匹配,只作字符匹配

  
grep 'PATTERN' FILE1

grep --color ''  把搜索结果带颜色
     -E  扩展正则表达式
     -v  反向过滤  匹配到的不显示
     -i  忽略字符大小写
     -An  after
     -Bn  befor
     -Cn 
     -o  只显示匹配到的串本身,不显示串的那一行
     [[:space:]]  表示空白字符

问  显示/etc/sysconfig
    
RE:正则表达式,包含几个元字符


globbing
*
[]
[^]
两类:
    基本正则表达式
    ^ 行首锚定符(脱字符)     grep '^bin' /etc/shells
    $ 行尾锚定符     grep 'bin$' /etc/shells
    ^$ 空白行
    . 匹配任意单个字符
    * 匹配其前任意次(0,1,或多次)  a*b ab aab acb 全都符合
     .*  匹配 任意长度的任意字符
    x\{m,n\}   x至少出现m次,至多出现n次
    a.b   grep "a\.b"
    \<词首锚定符\<,\b
    \>词尾锚定符\>,\b    grep "love.*"
    \(\)
    [[:space:]]
    [[:punct:]]
*尽可能长的匹配

如何精确匹配IP地址:

grep  --color "\(l..e\).*\lr" test.txt   \1表示引用第一个左括号中内容
   
grep --color "l\([15]\):\l:.*\l$"  inittab

grep --color "^[sS]" /proc/meminfo

grep --color "nologin$" /etc/passwd

grep --color "^#[[:space:]]\{1,\}.*" /etc/inittab
.*[^[:space]]$

grep --color ":[0-9]:" /etc/inittab

grep --color "^[[:space:]]\{1,\}" /boot/grub/grub.conf
 
grep --color "\(^[0-9]).*\1$" /etc/inittab

ifconfig | grep -0 --color "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1.3\}" | grep -v "127.0." | grep -v "255."
grep --color "" /etc/sysconfig/network-scripts/ifcfg-eth0

grep -v --color "^$" /etc/inittab   非空白行


扩展正则表达式:

不支持:\{\}    {}
egrep

^

$

*

[]

+ :匹配其前导字符1次或多次

?: 匹配其前导字符1次或0次

| : 表示或者  a|b  a或者b    grep  -E "^(s|S)"  /

():  分组  (ab)*

{}:  指定次数==基本正则里的\{\}

cut:
    -d' ' 表示以空格为分隔符 分隔符  -d:   以冒号为分隔符
    -f1  第一段  1,3  一段和第三段   1-3   一段到三段
   
文件排序:
sort
   sort [options] file(s)

   -r   降序
   -n   按数值大小
   -u   去除重复= uniq   把连续的重复的行去除
 
uniq
   -u  只显示曾经不重复的行
   -d  只显示曾经重复过的行

wc
   统计命令行数
   -l   只显示行数
   -w   只显示单词数
   -c   只显示字符数

希望显示There are 70 users.

wc -l /etc/passwd | cut -d' ' -f1

diff/patch

tr

tr -d 'ab'  删除有ab的行

grep "^[^[:space:]]"    第一个^是锚定行首 第二个^表示否定
上面表示段首非空

脚本编程:

顺序执行
选择分支(条件判断)
循环执行

跳转(一般不用)

循环执行
for
while
until

for循环的用法:
1+...+100

user1,user50

for VAR in LIST; do
  statement1
  statement2
done

遍历式的执行:

LIST的生成方法:
 `seq 1 100`   表示1-100
{1..100}
`cat /etc/shells`  (注意:如果某一行中间有空格的话,此行可能被识别成多行)
 seq 1 2 99   表示奇数   2表示步进长度

加法运算的方法:
let
C=$[$A+$B]
C=$(($A+$B))

+ - * / %