一、 变量和运算符

1.set命令 可以查看和设置本地变量

2.readonly 查看本地只读变量

readonly variable-name 设置变量为只读变量

3.环境变量的设置在$HOME/.bash_profile (/etc/profile)中

4.export variable-name=value 设置变量为环境变量

5.env 查看所有环境变量

6.变量替换:

${var-name}显示实际值到var-name

${var-name:+value}如果设置了var-name,则显示其值为value,否则为空

${var-nmae:?value}如果未设置var-name,显示用户定义错误信息value

${var-name:-value}如果未设置var-name,显示其值为value

${var-nmae:=value}如果未设置var-name,设置其值,并显示

7.unset 取消变量

8.位置变量

$0       $1           $2           $3     $4  

脚本名   第一个参数 A   第二个参数 B   。。。。C   。。。。D    

注意:$10是表示第一个参数后面加上“0”,第10个参数可以通过shift命令得到

可用shift 或者shift[n]来表示左移参数的位置

shift与shift[1]相同,都是左移一个位置(从$1开始算,$0-脚本名是不会边的),如上图则$1的 值 为   B,$2的值为C......

$# 参数的个数($0不算在内)

$* 和 $@ 都是列出全部参数,下面举例说明它们的差异:

比如在命令行中输入 ./test.sh A "B C" D

则 $*和$@都为 A B C D

但是如果用了软引用之后:

"$@"可得到 "A" "BC" "D"三个字段

而"$*"则得到"A B C D"一个字段

9.标准变量(大部分都是环境变量):

EXINIT:保存使用vi初始化选项,如EXINIT='set nu tab=4';exprot EXINIT

IFS:域分隔符,默认是空格,可改边IFS=: 或 IFS=':'

HOME:主目录

LOGNAME:登录名

MAILCHECK:每隔多长时间检查是否有邮件

MAILPATH:用于多个邮箱时查看MAIL存储在哪几个文件中

TERM:终端类型

PATH:指定了当用户输入命令时linux搜索程序的目录由冒号:分隔,shell将按PATH中给出的顺序搜 索这些目录。找到的第一个与命令名称一致的可执行文件将被执行

TZ:时区

PS1:主提示符,其缺省值 '[\u@\h \w]\$ '

u:用户 h:主机名 w:当前的目录。最后的"$"是普通用户的提示符,特权用户是"#"

PS2:辅助提示符,一行中若需用多个命令时的提示符,缺省是">",如果用户在行末输入"\",然后 回车, 则会有改符号出现。

PWD:当前运行的进程号

$$:当前运行的进程号

$!后台运行的最后一个进程的ID

$- 显示shell使用的当前选项,与set相同

$? 显示最后命令的退出状态,0表示没有错误,其他表示错误。

10.影响变量的命令

(1)declare   设置或者显示变量

 -f     只显示函数名

 -r     创建只读变量

 -x     创建转出变量

 -i     创建整数变量

用+代替-可以颠倒选项的含义(r不能颠倒)

(2)export 创建传给子shell的变量(创建环境变量)

 --表明选项结束,所有的后续参数都是实参

 -f表明在“名-值”对中的名字是函数名

 -n把全局变量转换成局部变量,命令的变量不再传给子shell

 -p显示全局变量列表

(3)readonly 用于显示或者设置只读变量

 --表明选项结束

 -f创建只读变量

(4)typeset   用于显示或设置变量,是declare的同义词

(5)unset 取消变量的定义

--表明选项结束

-f删除只读变量(但不能取消从shell环境中删除指定的变量和函数,如PATH,PS1,PDID,EUID,PID,UID等)

11.双引号:

使用双引号可引用除字符$,`,\ 外的任意字符和字符串

12.单引号:

单引号与双引号不同的是shell会忽略任何引用值。换句话来说,如果屏蔽了其特殊含义,会将引号里所有的字符,包括引号作为一个字符串

13.反引号:

设置系统命令的输出到变量。shell将反引号里的命令的内容作为一个系统命令并执行其内容

14.反斜杠:

 如果一个字符有特殊的意义,反斜杠可以屏蔽其含义,有特殊含义的字符有:& * + ^ $ ` " | ?

15.运算符:

按位运算符有:~ ,<<,>>,^>|,&

$[ ]表示对方括号中的表达式求值 $[ 2+8 ].(注意[]内左右都必须留空格)

$[ 2#111+1 ]=8 表示二进制的1111+1

运算符的优先级

以下级别高的优先级高

13级:+,- (正负)

12级:!,~ (逻辑非,按位取反)

11级:*,/,% (乘,除,取摸)

10级:+,- (加减)

9级:<<,>>按位左移动,右移

8级:<=,>=,<,> (小于等于,大于等于,小于,大于)

7级:==,!= (等于,不等于)

6级:& 按位与

5级:^ 按位异或

4级 | 按位或

3级&& 逻辑与

2级 || 逻辑或

1级=,+=,-=,*=,/=,%=,|=,<<=,>>=

         二、Shell输入与输出

1.echo 命令可以显示文本行或者变量,或者把字符串输入到文件

echo [option] string

-e 解析转义字符,

 转义符包括(

\c,回车不换行

\f,禁止

\t,跳格

\n)回车换行

-n 回车不换行,linux系统默认回车换行

2.read 从键盘或者文件的某一行文本中读如信息,并将其赋给一个变量

read varible1 varible2

如果只指定了一个变量,那么read将会把所有的输入赋给该变量,直到遇到第一个文件结束符或回车;如果给出了多个变量,它们按吮吸分别赋给不同的变量,。shell将用空格作为变量之间的分隔符

举例说明:在shell脚本中有read A B C命令行,而在提示的命令行中输入1 2 3,则A=1,B=2,C=3

3.cat 可以用来显示文件内容、创建文件,还可以用它来显示控制字符。

cat |options|filename1..filename2...

-v显示控制字符

使用cat命令时要注意,它不会在文件分页符处停下来,它会一下显示完整个文件。如果希望每次显示一页,可以使用more命令或者把cat命令的输出通过管道传递给另外一个具有分页功能的命令(如more,less)中。

cat命令举例:

cat myfile1 myfile2 myfile3>myfile123;

cat myfile123|more 分页显示

cat -v dos.txt 会出现“^M”等控制字符,这是在windows下的编辑器留下的

4.管道 可以通过管道把一个命令的输出作为另一个命令的输入

举例说明:df -k |awk '{print $1}'|grep -v "Filesystem"

df:显示所有文件系统对i节点和磁盘块的使用情况

awk:浏览和抽取信息

grep:文本过滤

显示所有文件系统对i接点和磁盘块的使用情况信息中的第一列并不含有"Filesystem"的信息



5.tee : 把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中

tee -a file 这个命令一般用于管道之后。

举例说明:

cat file|tee file.out 将file中的信息输出到屏幕并拷贝到file.out中

6.exec : exec命令可以用来代替当前shell;换句话说,并没有启动子shell,使用这一命令时任何现有环境都会   被清除,并重新启动一个shell

exec command其中的command通常是一个shell脚本

对文件描述符操作的时候(也只有在这时),它不会覆盖你当前的shell

举例说明:

exec **.sh 会重新登录并清除环境变量

7.标准输入、输出和错误

在shell中执行命令时,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件。由于文件描述符不容易记忆,shell同时也给出了相应的文件名。

       文件         文件描述符  

输入文件----标准输入       0(缺省是键盘,也可以是文件或者其他命令的输出)  

输出文件---标准输出       1(缺省是屏幕,也可以是文件)  

错误输出文件--标准错误   2(缺省是屏幕,也可以是文件)  

系统中实际有12个文件描述符,可以任意使用文件描述符3-9

8.文件重定向 改变程序运行的输入来源或输出地点

 command > filename 把把标准输出重定向到一个新文件中

 command >> filename 把把标准输出重定向到一个文件中(追加)

 command 1 > fielname 把把标准输出重定向到一个文件中

 command > filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中

 command 2 > filename 把把标准错误重定向到一个文件中

 command 2 >> filename 把把标准输出重定向到一个文件中(追加)

 command >> filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中(追加)

 command < filename >filename2 把command命令以filename文件作为标准输入,以filename2文件作为标准输出

 command < filename 把command命令以filename文件作为标准输入

 command << delimiter 把从标准输入中读入,直至遇到delimiter分界符

 command <&m 把把文件描述符m作为标准输入

 command >&m 把把标准输出重定向到文件描述符m中

 command <&- 把关闭标准输入

 重定向的几个注意点:

 重定向中为保护原来的文件不被覆盖可以用 set -o noclobber 命令来限制

 用 set +o noclobber来取消限制,如果不取消的话也可以强制重定向

 command >| file

 cat file 会清空file中的内容,因为shell会先清空stdout和stderr的管道。

   cat >file会造成死循环,因为它是一行行读出来的,永远都没有结束符

9.合并标准输出和标准错误

 合并标准输出和标准错误的时候,切记shell是用左至右分析相应的命令

举例说明:

grep "hi" test.txt >test.out 2>&1 标准输出和错误输出都输入到标准输出中

10.使用文件描述符

 举例说明:

 exec 3<&0 0

 此时的exec不会清除环境变量,也不会重新登录,覆盖当前的sehll



         三、流控制结构

1.if then else 语句

if 条件1         #如果条件1为真

then           #那么

 command1       #执行命令1

elif 条件2       # 如果条件2为真

then           #那么

 command2       # 执行命令2

else           #如果条件1和条件2都不成立

 command3 执行命令3

fi           #完成(if 语句一定要以fi结束)

举例说明:

if [ "13" -lt "11"]   #如果13小于11

then         #那么

   echo "13<11"   #输出"13<11"

elif["13" -lt "12"]   #如果13小于12

then         # 那么

   echo "13<12"   #输出"13<12"

else         #否则

   echo "13>=12"   #输出"13>=12"

2.case语句

case 值 in

模式1)     #如果模式1匹配

 命令1     #执行命令1

   ;;

模式2)     #如果模式2匹配

   命令2   #执行命令2

   ;;

*)       #如果以上模式都不匹配

   命令3   #执行命令3

   ;;

esac       #结束case语句

case取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;。模式匹配符号*表示匹配任意字符。[。。]表示类或者范围中的任意字符。

举例说明:

case $A in

 1)        #如果A的值为1

 echo "A =1"   #输出“A=1”

 ;;

 2)         #如果A的值为2

   echo "A=2"   #输出“A=2”

   ;;

   [34])       #如果A的值为3或4

   echo "A=3|4"   #输出“A=3|4”

   ;;

   esac       #结束

3.for循环

 for 变量名 in 列表

 do

   命令1

   命令2

 done

当变量值在列表里,for 循环即执行一次所有命令,使用变量名访问列表取值。命令可为任何有效的shell命令和语句。变量名为任何单词。in列表用法是可选的,如果不用它,for循环使用命令行的位置参数。in列表可以包含替换,字符串和文件名

举例说明:

for loop in 1 2 3 4 5         #在1 2 3 4 5列表中循环(5次)

do               #开始执行命令

 echo "hello"          #执行命令

done               #完成



for loop in "one two three"     #当成一个元素只循环一次

do

 echo $loop

done               #输出 one two three 一行

for loop in one two three     #三次循环

do

 echo $loop

done

#输出 one

 two

 three

列表可以是文件,如:for loop in `cat myfile`

4.until循环

until 条件

do

 命令1

 命令2

done

条件可为任何测试条件,若刚开始条件就为真,则不执行循环。

5.while循环

while 命令

do

   命令1

   命令2

   ......

done

举例说明:while read LINE

     do

       echo $LINE     #输出每行的信息

     done

6.break控制

break [n]            #跳出n层循环

举例说明:

for loop in 1 2 3

done

echo ${loop}

   for loop in one two three

   do

   echo ${loop}

   //break /break 2 /continue #这三个命令替换测试

   echo ${loop}+

   done

   done

若为break,则输出 1 one 2 one 3 one

若为break 2 则输出 1 one

若为continue 则输出1 one two three 2 one two three 3 one two three (每次输出都有换行)注意:echo ${loop}+没有执行

7.continue控制

强制进入下一次循环 如上例子

             四、文本过滤

1.正则表达式

(1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符a-z)以及特殊字符(称为元字符,如/、*、?等)组成。

(2)基本元字符集及其含义

   ^ :只匹配行首。   如^a 匹配以a开头的行abc,a2e,a12,aaa,......

   $ :只匹配行尾。   如^a 匹配以a结尾的行bca,12a,aaa,.......

   * :匹配0个或多个此单字符。 如(a)* 匹配 空,a,aa,aaa,....

   [] :只匹配[]内字符。可以是一个单字符,也可以是字符序列,用","将里面要匹配的不同字符串分开。也可以使用-来表示[]内字符序列的范围,如[1-5]表示[12345]

   \ :只用来屏蔽一个元字符的特殊含义。 如\*,\',\",\|,\+,\^,\. 等

   。:(点)只匹配任意单字符。

   pattern\{n\}:只用来匹配前面pattern出现的次数.n为次数。如a\{2\}匹配aa.

   pattern\{n,\}:含义同上,但次数最少为n.如a\{2,\}匹配aa,aaa,aaaa,.....

   pattern\{n,m\}:含义同上,但次数在n和m之间。如a\{2,4\}匹配aa,aaa,aaaa三个

(3)举例说明:

   ^$ :匹配空行

   ^.$ :匹配包含一个字符的行

 \*\.pas :匹配以*.pas结尾的所有字符或文件

 [0123456789]或[0-9] :假定要匹配任意一个数字

 [a-z] :任意小写字母

 [A-Za-z] :任意大小写字母

 [S,s] :匹配大小写S

 [0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\} :匹配IP地址 [0-9]\{3\}三个0-9组成的字符串;\. :匹配点(注意这里点是特殊的字符,所以要用"\"来屏蔽其含义)

2.find介绍

(1)查找具有某些特征文件的命令,可遍历当前目录甚至于整个文件系统来查看某些文件或目录,其遍历大的文件系统时一般放在后台执行。

(2)find命令的一般形式

   find pathname -options [-print -exec -ok]

   -pathname :find命令所查找的目录路径。如用"."来表示当前的目录,用/来表示系统根目录

   -print :find命令将匹配的文件输出到标准输出

   -exec: find命令对匹配的文件执行该参数所给出的shell命令,相应的命令形式为

   'command'{} \; (注意{}和\之间的空格)

   -ok 和 -exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

 options有如下几种:

 -name :按照文件名查找文件

 -perm :按照文件权限来查找文件

 -user :按照文件属主来查找文件

 -group :按照文件所属的组来查找文件

 -mtime -n +n 按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。find命令还有-atime 和-ctime选项,但它们都和-mtime选项相似。

 -size n[c]查找文件长度为n块的文件,带有c时表示文件长度以字节计。

 -nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在

 -newer file1 !file2查找更改时间比文件file1新但比文件file2旧的文件

 -depth 先查找指定目录有无匹配文件,若无则再在子目录中查找

 -type 查找某一类型的文件,如

   b :块设备文件

   d:目录

   e:字符设备文件

   p;管道文件

   l:符号链接文件

   f:普通文件

(3)find命令举例

   find -name "*.txt" -print 查找txt结尾的文件并输出到屏幕上

   find /cmd ".sh" -print 查找/cmd目录下所有sh文件,并输出

   find . -perm 755 -print 查找当前目录下权限为755的文件,并输出

   find `pwd` -user root -print 查找当前目录下属主为root的文件,并输出

   find ./ -group sunwill -print 查找当前目录下所属主是sunwill的文件

   find /var -mtime -5 -print 查找/var目录下更改时间为5天内的所有文件

   find /var -mtime +5 -print 查找/var目录下更改时间为5天以前的所有文件

   find /var -newer "myfile1" ! -newer "myfile2" -print 查找/var目录下比myfile1新,但是比myfile2旧的所有文件。

   find /var -type d -print 查找/var目录下所有目录

   find /var -type l -print 查找/var目录下所有的符号链接文件。

   find . -size +1000000c -print 查找当前目录下大于1000000字节的文件

   find / -name "con.file" -depth -print 查找根目录下有无"con.file",若无则在其子目录中查找

   find . -type f -exec ls -l {} \; 查找当前目录下是否有普通文件,若有则执行ls -l

 (4)xargs命令

   在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec。不幸的是,有些系统对能够传递给exec的命令长度有限制,这样find命令运行几分钟之后就算出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs的用处所在,特别是与find命令一起使用,exec会发起多个进程,而xargs会多个,只有一个

   find ./ -perm -7 -print | xargs chmod o-w 查找权限为7的文件并传递给chmod处理



3.grep介绍

(1)grep 的一般格式为 grep [options] 基本正则表达式 [文件]

   字符串参数最好采用是双引号括,一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串

   -c:只输出匹配行的记数

   -i:不区分大小写(只适用于单个字符)

   -h:查询多个文件时不显示文件名

   -H:只显示文件名

   -l:查询多文件时只输出包含匹配字符的文件名

   -n:只显示匹配行及其行号

   -s:不显示不存在或无匹配文本的错误信息。

   -v:显示不包含匹配文本的所有行。

(2)举例说明:

   grep ^[^210] myfile 匹配myfile中以非2、1、0开头的行

   grep "[5-8][6-9][0-3]" myfile 匹配myfile中第一位为5|6|7|8,第二位6|7|8|9,第三位为0|1|2|3的三个字符的行

   grep "4\{2,4\}" myfile 匹配myfile中含有44,444或4444的行

   grep "\?" myfile匹配myfile中含有任意字符的行

(3)grep命令类名

   [[:upper:]]   表示[A-Z]

   [[:alnum:]]   表示[0-9a-zA-Z]

   [[:lower:]]   表示[a-z]

   [[:space:]]   表示空格或者tab键

   [[:digit:]]   表示[0-9]

   [[:alpha:]]   表示[a-zA-Z]

 如:grep "5[[:digit:]][[:digit:]]" myfile 匹配myfile中含有5开头接下去两位都是数字的行。



4.awk介绍

可以从文件或字符串中基于指定规则浏览和抽取信息,是一种自解释的变成语言。

(1)awk命令行方式 awk [-F filed-spearator] 'command' input-files

 awk脚本:所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。awk脚本是由各种操作和模式组成。

 模式部分决定动作语句何时触发及触发事件。(BEGIN,END)

 动作对数据进行处理,放在{}内指明(print)

(2)分隔符、域和记录

 awk执行时,其浏览域标记为$1,$2,...$n.这种方法成为域标识。$0为所有域。

(3)举例说明:

   awk '{print $0}' test.txt |tee test.out 输出test.txt中所有行$0表示所有域

   awk -F : '{print $1} test.txt |tee test.out'   同上。。只是分隔符为":"

   awk 'BEGIN {print "IPDate\n"}{print $1 "\t" $4} END{print "end-of-report"}' test.txt

   开始时打印“IPDate”结束时打印“end-of-report”中间打印主体信息,比如总共匹配三条信息,则输出如下:  

IPDate

1 first

2 second

3 third

end-of-report

(4)匹配操作符 ~ 匹配,!~ 不匹配

   cat test.txt |awk '$0~/210.34.0.13/' 匹配test.txt中为210.34.0.13的行

   awk '$0!~/210.34.0.13' test.txt   匹配test.txt中不是210.34.0.13的行

   awk '{if($1=="210.34.0.13") print $0}' test.txt 匹配 test.txt中第一个域为210.34.0.13的行。