bash shell脚本常用方法总结

在日常系统管理工作中,需要编写脚本来完成特定的功能,编写shell脚本是一个基本功,在编写的过程中,掌握一些常用的技巧和语法就可以完成大部分功能了,也就是2/8原则。

1. 单引号和双引号的区别

单引号与双引号的最大不同在于双引号仍然可以引用变量的内容,但单引号内仅是普通字符 ,不会作变量的引用,直接输出字符串。请看如下例子:

2. 逐行读取文件
使用for循环来读取文件

注意:由于使用for来读入文件里的行时,会自动把空格和换行符作为一样分隔符,如果行里有空格的时候,输出的结果会很乱,所以只适用于行连续不能有空格或者换行符的文件。

使用while循环读取文件

注意:由于使用while来读入文件里的行时,会整行读入,不会关注行的内容(空格..),所以比for读文件有更好的适用性,推荐使用while循环读取文件。

3. bash shell 脚本中常用隐含变量

注意:

例:

从输出结果可以看出 "$*" 输出是一行 而 "$@" 输出则是四行

4. 变量内容的删除与替换

需要对变量中的字符串进行查找删除或者替换时,就需要使用下表列出的方法

变量设定方式 说明
${变量#关键字} 若变量内容从头开始的资料符合‘关键字’,则将符合的最短资料删除
${变量##关键字} 若变量内容从头开始的资料符合‘关键字’,则将符合的最长资料删除
${变量%关键字} 若变量内容从尾向前的资料符合‘关键字’,则将符合的最短资料删除
${变量%%关键字} 若变量内容从尾向前的资料符合‘关键字’,则将符合的最长资料删除
${变量/旧字串/新字串} 若变量内容符合‘旧字串’则‘第一个旧字串会被新字串取代
${变量//旧字串/新字串} 若变量内容符合‘旧字串’则‘全部的旧字串会被新字串取代

例如删除字符窜中的某个字符:

5. 变量条件测试赋值

‘判断’某个变量是否存在,若变量存在则将此变量值赋值给新的变量,若变量不存在则将其他值赋值给新的变量。

变量设定方式 str 未定义 str 为空字串 str 已赋值为非空字串
var=${str-expr} var=expr var= var=$str
var=${str:-expr} var=expr var=expr var=$str
var=${str+expr} var= var=expr var=expr
var=${str:+expr} var= var= var=expr
var=${str?expr} expr 输出至 stderr var= var=$str
var=${str:?expr} expr 输出至 stderr expr 输出至 stderr var=$str
var=${str=expr} var=expr var= var=$str
var=${str:=expr} var=expr var=expr var=$str

例如:

基本上这种变量的测试也能够透过 shell script 内的 if...then... 来处理,不过通过上述提及的简单的方法来测试变量,可使程序看起来更精简一些。

6. shell 中分隔符 : 变量IFS 使用

shell脚本中,如果使用for循环一个字符窜的话,默认使用空格来分割字符窜.还有前面所提到的 使用for循环逐行读取文件内容时候,文件行中如果有空格的话输出的结果也会变乱.这个时候 使用 IFS 变量来设置特定的字符窜分割符来,达到输出正确的目的.默认情况下 IFS 是使用 , 空格 \t \n 来作为默认的分割符的。

将前面使用for逐行读取文件的例子改进下就可以输出正确了:

file.txt 文件内容如下

执行测试程序 输出结果如下(正确输出)

如果未设置IFS变量,使用默认的IFS变量值 ,输出结果如下

从以上测试程序输出结果,可以根据自己的需求来设定 IFS变量,在举一个例子如下:

7. shell 数组的使用

数组赋值方式:

计算数组元素个数或者长度:

例:

将文件内容读取到数组中:

8. 逻辑判断 条件测试
文件属性的判断
操作符 测试结果
-e filename 文件存在返回1, 否则返回0
-r filename 文件可读返回1,否则返回0
-w filename 文件可写返回1,否则返回0
-x filename 文件可执行返回1,否则返回0
-o filename 文件属于用户本人返回1, 否则返回0
-z filename 文件长度为0返回1, 否则返回0
-f filename 文件为普通文件返回1, 否则返回0
-d filename 文件为目录文件时返回1, 否则返回0

例如测试文件是否存在:

字符串比较
操作符 比较结果
str1 = str2 当两个字串相等时为真
str1 != str2 当两个字串不等时为真
-n str1 当字符串的长度大于0时为真
-z str1 当字符串的长度为0时为真
str 当字符串为非空时为真

例如比较字符串来测试用户ID :

数值比较(整数)
操作符 比较结果
num1 -eq num2 两数相等为真
num1 -ne num2 两数不等为真
num1 -gt num2 num1大于num2为真
num1 -ge num2 num1大于等于num2为真
num1 -lt num2 num1小于num2为真
num1 -le num2 num1小于等于num2为真

例如:

若要查看详细的测试操作,可以查看man手册 man test

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: