shell编程

一、简介

Shell脚本语言是Linux/Unix系统上一种重要的脚本语言,在Linux/Unix领域应用极为广泛,利用Shell脚本语言可以简洁地实现复杂的操作,而且Shell脚本程序往往可以在不同版本的Linux/Unix系统上通用。Shell脚本语言简单、易学、易用,适合处理文件和目录之类的对象,以简单的方式快速完成某些复杂的事情通常是创建脚本的重要原则。

二、基本格式

Shell脚本的文件名后缀通常是.sh,当然你也可以使用其他后缀或者没有后缀,.sh是为了规范。

#!/bin/bash --或者写成!/bin/sh,是shell脚本的固定开头格式,其实你不写也没关系,只是不规范。

#第一个shell小程序 --shell中注释使用#开头

echo "This is current directory." --echo命令和java中的system.out.println()相似,打印输出内容

/bin/pwd --查看当前目录

echo --输出空行

echo "This is files."

/bin/ls --查看当前目录的文件列表

/bin/date +%F >> /test/shelldir/ex2.info --将当前时间以yyyy-MM-dd的形式输出追加到/test/shelldir/ex2.info文件中,如果使用">"则不是追加而是覆盖了

执行shell脚本方法:

1、可以通过命令"sh xxx.sh"来执行,通过这种方式执行的话脚本开头就可以不写"#!/bin/bash",因为sh命令已经说明这是shell脚本;

2、通过全路径或者相对路径执行,全路径比如:/usr/local/shell/test.sh,相对路径(当前就在/usr/local/shell目录下)比如:./test.sh。通过这种方式执行的话,脚本开头需写上"#!/bin/bash",以表明这是shell脚本,并且当前用户需拥有该脚本的执行权限,否则会报Permission denied的错误。

三、shell的变量

变量是shell传递数据的一种方法,用来代表每个取值的符号名。shell有两类变量:临时变量和永久变量。

使用set命令可以查看系统内的所有变量,unset命令删除指定的变量。

3.1 临时变量

临时变量是shell程序内部定义的,其使用范围仅限于定义它的程序,对其它程序不可见。包括,用户自定义变量、位置变量等。

3.1.1 自定义变量

用户定义的变量由字母或下划线开头,有字母、数字或下划线组成,并且区分大小写,变量名长度没有限制。一般习惯上变量用大写字母表示,并且由英文字母开头。变量的赋值使用"=",并且两边不能有空格,要紧挨着。在使用变量时,在变量名前加上前缀"$"。

可以将一个命令的执行结果赋值给变量,但需要使用命令替换符号"`",即在英文模式下按波浪键。

单引号和双引号是有区别的,双引号会把里面的变量用变量值替换,而单引号就是纯粹的字符串,会原封不动输出。

#!/bin/sh

DATE=`/bin/date +%Y%m%d` --把获取当前时间的命令的执行结果赋值给变量DATE

echo 'TODAY IS $DATE' --输出字符串,输出结果就是TODAY IS $DATE没有一点变化

echo "TODAY IS $DATE" --输出字符串,其中$DATE会被替换为实际值

3.1.2 位置变量

比如ex1.sh脚本如下:

/bin/ls -l $1 --查看1号位置变量(也就是参数1)所指定的目录下的文件

/bin/ls -l $2 --查看2号位置变量(也就是参数2)所指定的目录下的文件

/bin/ls -l $3 --查看3号位置变量(也就是参数3)所指定的目录下的文件

然后执行:sh ex1.sh /test1 /test2 /test3,输出结果就是根目录下的test1目录、test2目录、test3目录这三个目录下的文件列表。

在shell脚本中,位置变量最多10个,用$0-$9表示,其中$0表示的是执行的shell脚本文件名,其他的就是对应的输入参数。

3.1.3 特殊变量

除了$(0-9)这些位置变量外,在shell脚本中还有一些特殊变量,如下:

$* --这个程序的所有参数

$# --这个程序的参数个数

$$ --这个程序的PID

$! --执行上一个后台命令的PID

$? --执行上一个命令的返回值

3.1.4 键盘入录

在shell脚本中可以通过read命令从键盘读入数据,赋给变量,比如有个ex1.sh脚本:

#!/bin/sh

read f s t --使用read命令从键盘读入三个变量,变量名可以随便取

echo "the first is $f" --依次输出三个变量

echo "the second is $s"

echo "the third is $t"

然后执行:sh -x ex1.sh,其中-x选项是让脚本执行过程中输出每行语句,可以当做调试shell脚本使用。执行结果就是输出read f s t后一直等待着键盘输入,输入三个变量值,每个用空格隔开,再按回车,即可继续执行脚本。

3.2 永久变量

永久变量是环境变量,其值不随shell脚本的执行结束而消失,比如:

echo $PATH --和windows里的环境变量path一样,存放的是一些目录,这些目录下的命令可以在任何目录直接调用

echo $LANG --$LANG变量存放的是系统的默认语言,比如我安装的CentOS7的语言是zh_CN.UTF-8

四、shell的运算

使用expr命令对整数进行运算,不能计算非整数。

注意点:

1、expr的运算必须用空格间隔开。

2、乘法需使用\*来表示转义字符。

3、运算时会先算乘除后算加减,如果需要优先运算则需要加命令替换符。

4、也可以对变量进行运算操作。

 

五、test测试命令

test命令用来检查文件和比较值,一般配合控制语句使用,不应该单独使用。用法如下:

  1)判断表达式

  if test  (表达式为真)

  if test !表达式为假

  test 表达式1 –a 表达式2                  两个表达式都为真

  test 表达式1 –o 表达式2                 两个表达式有一个为真

  2)判断字符串

  test –n 字符串                                   字符串的长度非零

  test –z 字符串                                    字符串的长度为零

  test 字符串1=字符串2                    字符串相等

  test 字符串1!=字符串2               字符串不等

  3)判断整数

  test 整数1 –eq 整数2                        整数相等

  test 整数1 –ge 整数2                        整数1大于等于整数2

  test 整数1 –gt 整数2                         整数1大于整数2

  test 整数1 –le 整数2                         整数1小于等于整数2

  test 整数1 –lt 整数2                          整数1小于整数2

  test 整数1 –ne 整数2                        整数1不等于整数2

  4)判断文件

  test  File1 –ef  File2        两个文件具有同样的设备号和i结点号

  test  File1 –nt  File2        文件1比文件2 新

  test  File1 –ot  File2        文件1比文件2 旧

  test –b File        文件存在并且是块设备文件

  test –c File        文件存在并且是字符设备文件

  test –d File        文件存在并且是目录

  test –e File        文件存在

  test –f File         文件存在并且是正规文件

  test –g File        文件存在并且是设置了组ID

  test –G File        文件存在并且属于有效组ID

  test –h File        文件存在并且是一个符号链接(同-L)

  test –k File        文件存在并且设置了sticky位

  test –b File        文件存在并且是块设备文件

  test –L File        文件存在并且是一个符号链接(同-h)

  test –o File        文件存在并且属于有效用户ID

  test –p File        文件存在并且是一个命名管道

  test –r File        文件存在并且可读

  test –s File        文件存在并且是一个套接字

  test –t FD        文件描述符是在一个终端打开的

  test –u File        文件存在并且设置了它的set-user-id位

  test –w File        文件存在并且可写

  test –x File        文件存在并且可执行

在shell脚本中,test命令可以使用[]来替换,比如test -d File等价于[ -d File ],注意别忘了空格,即["空格" -d File "空格"]。

六、控制语句

6.1 if语句

#!/bin/sh

# if test -d $1 then ... else ... fi

if [ -d $1 ] --等价于if test -d $1

then

echo "this is a directory!" --如果条件成立,即$1存在并且是个目录,就走这里

else

echo "this is not a directory!" --else后面不用跟then

fi --if语句结束

6.2 elif语句

#!/bin/sh

# if test then ... elif test then ... else ... fi

if [ -d $1 ]

then

echo "is a directory!"

elif [ -f $1 ]

then

echo "is a file!"

else

echo "error!"

fi

6.3 逻辑与和逻辑或

shell中使用-a和-o表示逻辑与和逻辑或。

#!/bin/sh

# -a -o

if [ $1 -eq $2 -a $1 = 1 ]

then

echo "param1 == param2 and param1 = 1"

elif [ $1 -ne $2 -o $1 = 2 ]

then

echo "param1 != param2 or param1 = 2"

else

echo "others"

fi

6.4 for循环

#!/bin/sh

# for var in [params] do ... done

for var in 1 2 3 4 5 6 7 8 9 10 --这种循环没多大用,要循环的列表是死的,不能写成变量的形式,如果你要循环1-100,用这种方式要写很长。

do

echo "number is $var"

done --for循环结束

6.5 select循环

select循环用的也不多。

#!/bin/sh

# select var in [params] do ... done

select var in "java" "c++" "php" "linux" "python" "ruby" "c#"

do

break

done

echo "you selected $var"

执行该脚本后会输出java~c#这7个选项,然后等你选择,比如你输入1后就会输出you selected java,如下图所示:

 

6.6 case语句

#!/bin/sh

read op --等等输入一个值,会赋值给op,然后继续执行

case $op in

a) --如果输入的是a,则执行它下面的语句

echo "you selected a";;

b)

echo "you selected b";;

c)

echo "you selected c";;

*) --如果以上的都不符合,则执行它下面的语句

echo "error"

esac --case语句结束

6.7 while循环

#!/bin/sh

#while test do ... done

num=1 --自定义变量

sum=0

while [ $num -le 100 ] --如果满足条件$num<=100,则执行do和done之间的语句

do

sum=`expr $sum + $num` --把sum和num两个变量求和再赋值给sum

num=`expr $num + 1` --num变量自增1

done --while循环结束

echo $sum --输出sum变量的最终值,其实就是对1~100进行求和,输出结果是5050

 

while循环还可以搭配continue和break使用,这也是很常见的:

#!/bin/sh

i=0

while [ $i -le 100 ]

do

i=`expr $i + 1`

if [ $i -eq 5 -o $i -eq 10 ] --如果i==5或者i==10则执行下面的continue,直接继续下一个循环

then continue; --最后的分号加不加都可以

else

echo "this number is $i"

fi

 

if [ $i -eq 15 ] --如果i==15则执行下面的break,直接跳出循环,while循环结束

then break;

fi

done

综上,上面的控制语句在shell编程中最常用的是if、elif、case、while。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章