虽然写过些shell脚本了,但是对于很多知识还是记忆不深刻。在看书的过程中,正好看到了相关常识,在此记录下以备后用。
执行数学运算
1.expr命令
➜ /etc expr 1 + 5
6
➜ /etc expr 1 * 5
expr: syntax error
➜ /etc expr 1 \* 5
5
注:1)数字与符号之间要有空格
2)个别符号需要转义,如上例中的星号(*)
2.使用方括号
在bash中,在将一个数学运算结果赋给某个变量时,可以用美元符合方括号($[ operation ])将数学表达式围起来。
➜ /etc var1=$[1 + 5]
➜ /etc echo $var1
6
➜ /etc var2=$[$var1 * 2]
➜ /etc echo $var2
12
在使用方括号来计算公式时,不用担心shell会误解乘号或者其他符号,这是一大优点。
浮点数运算
有时候会遇到浮点数算术操作,最常见的方案是用内建的bash计算器,叫做bc.
➜ /etc bc -q
3.44 / 5
0
scale=4
3.44 / 5
.6880
quit
上例中,-q是不显示bash计算器的欢迎信息。scale变量用来设置计算结果保留的小数位数。
在shell中的运用方式:
variable=$(echo "options; expression"|bc)
第一部分options允许设置变量,如果不止一个变量,可以使用分号将其分开。
expression参数定义了通过bc执行的数学表达式。例子如下:
➜ /etc var1=$(echo "scale=4;3.44 / 5"|bc)
➜ /etc echo $var1
.6880
数值比较
数值比较可以说是shell编程中最为常见的了,直接影响着流程的走向,因此对于数值比较知识点的掌握也极其重要了。
比较 | 描述 |
---|---|
n1 -eq n2 | 检查n1是否与n2相等 |
n1 -ge n2 | 检查n1是否大于或等于n2 |
n1 -gt n2 | 检查n1是否大于n2 |
n1 -le n2 | 检查n1是否小于或者等于n2 |
n1 -lt n2 | 检查n1是否小于n2 |
n1 -ne n2 | 检查n1是否不等于n2 |
字符串比较
条件还允许比较字符串值。
比较 | 描述 |
---|---|
str1 = str2 | 检查str1是否和str2相同 |
str1 != str2 | 检查str1是否和str2不同 |
str1 < str2 | 检查str1是否比str2小 |
str1 > str2 | 检查str1是否比str2大 |
-n str1 | 检查str1的长度是否非0 |
-z str1 | 检查str1的长度是否为0 |
文件比较
文件比较在shell编程中也是用的最多的比较形式。用于测试Linux文件系统上文件和目录的状态。
比较 | 描述 |
---|---|
-d file | 检查file是否存在并是一个目录 |
-e file | 检查file是否存在 |
-f file | 检查file是否存在并是一个文件 |
-r file | 检查file是否存在并可读 |
-s file | 检查file是否存在并非空 |
-w file | 检查file是否存在并可写 |
-x file | 检查file是否存在并可执行 |
-O file | 检查file是否存在并属于当前用户所有 |
-G file | 检查file是否存在并且默认组与当前用户相同 |
file1 -nt file2 | 检查file1是否比file2新 |
file1 -ot file2 | 检查file1是否比file2旧 |
复合条件测试
if-then语句允许使用布尔逻辑来组合测试,两种布尔运算符可用:
- [ condition1 ] && [ condition2 ]
- [ condition1 ] || [ condition2 ]
第一种布尔运算使用AND布尔运算来组合两个条件,要让then部分的命令执行,两个条件都必须满足。
第二种布尔运算使用OR布尔运算来组合两个条件,如果任意条件为TRUE,then部分的命令都会执行。
if-then的高级特性
bash-shell提供了两项可在if-then语句中使用的高级特性:
- 用于数学表达式的双括号
- 用于高级字符串处理功能的双方括号
1.使用双括号
双括号的命令格式如下:
(( expression ))
expression可以是任意的数学赋值或比较表达式。
2.使用双方括号
双方括号的命令格式如下:
[[ expression ]]
双方括号提供了模式匹配的功能。
如: [[ $USR == r* ]]可用来判断用户是否是以字母r开头
CASE命令
通过case命令不用写出冗长的if-then-else语句,而可以通过列表的方式来检查变量的多个值。
格式如下:
case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) commands;;
esac
case命令会将指定的变量与不同模式进行比较。如果变量和模式是匹配的,那么SHELL会执行为该模式指定的命令。可以通过竖线操作符在一行中分隔多个模式。星号(*)会捕获所有与已知模式不匹配的值。仔细一看,这个和JAVA的case非常相似。