一文彻底弄懂Linux-Shell编程
Posted 码农Maynor
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文彻底弄懂Linux-Shell编程相关的知识,希望对你有一定的参考价值。
一、Shell 编程之条件结构
1、Shell 条件测试语法
test 测试表达式 | 利用test命令进行条件测试表达式, test命令与测试表达式之间至少有一个空格 |
[ 测试表达式 ] | 通过[ ]中括号进行条件测试表达式, []中括号边界与测试表达式之间至少有一个空格 |
[[ 测试表达式 ]] | 通过[[ ]]双中括号进行条件测试表达式, [[ ]]双中括号与测试表达式之间至少有一个空格 |
((测试表达式)) | 通过(( ))双小括号进行条件测试表达式, ( ))双小括号两端不需要空格, 常用于整数对比 |
1、符号说明
‐su: syntax error near unexpected token ` '
[root@qfedu.com ~]# var=notest;echo $var;
notest
[root@qfedu.com ~]# echo $var
notest
# 修改了变量的值。表明在当前shell中运行的
[root@qfedu.com ~]# var=test
[root@qfedu.com ~]# echo $var
test
[root@qfedu.com ~]# (var=notest;echo $var)
notest
[root@qfedu.com ~]# echo $var
test
# () 里的执行完毕后没有改变变量的值, 说明在子shell中执行的
# $(( ))和$[ ]的用途一致 ,用来作整数运算。在 bash 中, $(( ))的整数运算符号大致有这些: # + ‐ * / 加、减、乘、除
# % 余数运算
# & | ^ ! AND、OR、XOR、NOT运算
举例:
[root@qfedu.com ~]# a=5; b=7; c=2
[root@qfedu.com ~]# echo $((a+b*c))
[root@qfedu.com ~]# echo $[a+b*c]
[root@qfedu.com ~]# echo $(((a+b)/c))
[root@qfedu.com ~]# echo $[(a+b)/c]
6
[root@qfedu.com ~]# echo $(((a*b)%c))
[root@qfedu.com ~]# echo $[(a*b)%c]
1
# $(( ))中的变量名称也可以在其前面加 $ 符号: $(($a+$b*$c))也可以得到 19 的结果。
# $(( ))还可以作不同进制(如二进制、八进位、十六进制)运算, 只是输出结果皆为十进制而已。
[root@qfedu.com ~]# echo $((16#2a)) # 16进位转十进制
42
# 当前的 umask 是 022, 新建文件的权限为:
[root@qfedu.com ~]# umask 022
[root@qfedu.com ~]# echo "obase=8; $(( 8#666 & (8#777 ^ 8#$(umask)) ))" | bc
[root@qfedu.com ~]# 644
# 单纯用(( ))也可以重定义变量值, 或作testing:
[root@qfedu.com ~]# a=5
[root@qfedu.com ~]# echo $((a++))
# 将 a 重定义为 6
双中括号[[ ]]中可以使用通配符进行匹配, 这是其区别于其它几种语法的地方
&&, | |, <, >等操作符可用于双中括号[[ ]]中, 但不能应用于[ ]中, 在[ ]中一般用-a, -o, -lt, -gt来代替
举例:
[root@qfedu.com ~]# test ‐f /tmp/test.txt && echo 1 | | echo 0 [root@qfedu.com ~]# [ ‐f /tmp/test.txt ] && echo 1 | | echo 0 [root@qfedu.com ~]# [[ ‐f /tmp/test.txt ]] && echo 1 | | echo 0 [root@qfedu.com ~]# ((3>2)) && echo 1 | | echo 0 |
2、获取帮助
[root@qfedu.com ~]# man test |
2、Shell 测试表达式用法
1、文件测试表达式
-d 文件 | 文件存在且为目录则为真 |
-f 文件 | 文件存在且为普通文件则为真 |
-e 文件 | 文件存在则为真, 不辩别是目录还是文件 |
-s 文件 | 文件存在且文件大小不为0则为真 |
-r 文件 | 文件存在且可读则为真, 与执行脚本的用户权限也有关 |
-w 文件 | 文件存在且可写则为真, 与执行脚本的用户权限也有关 |
-x 文件 | 文件存在且可执行则为真, 与执行脚本的用户权限也有关 |
-L 文件 | 文件存在且为链接文件则为真 |
f1 -nt f2 | 文件f1比文件f2新则为真, 根据文件的修改时间计算 |
f1 -ot f2 | 文件f1比文件f2旧则为真, 根据文件的修改时间计算 |
文件测试 [ 操作符 文件或目录 ]
[root@qfedu.com ~]# test ‐d /home
[root@qfedu.com ~]# echo $?
0
[root@qfedu.com ~]# test ‐d /home11111
[root@qfedu.com ~]# echo $?
1
[root@qfedu.com ~]# [ ‐d /home ]
[root@qfedu.com ~]# [ ! ‐d /ccc ] && mkdir /ccc
[root@qfedu.com ~]# [ ‐d /ccc ] | | mkdir /ccc
2、字符串测试表达式
# 提示: 字符串必须使用双引号
[root@qfedu.com ~]# [ "$USER" = "root" ];echo $?
0
[root@qfedu.com ~]# [ "$USER" == "root" ];echo $?
0
[root@qfedu.com ~]# BBB=""
[root@qfedu.com ~]# echo $#BBB
0
[root@qfedu.com ~]# [ ‐z "$BBB" ]
[root@qfedu.com ~]# echo $?
0
[root@qfedu.com ~]# [ ‐n "$BBB" ]
[root@qfedu.com ~]# echo $?
1
[root@qfedu.com ~]# var2=
[root@qfedu.com ~]#
[root@qfedu.com ~]# echo $#var1
3
[root@qfedu.com ~]# echo $#var2
0
[root@qfedu.com ~]# echo $#var3
0
[root@qfedu.com ~]# [ ‐z "$var1" ];echo $?
1
[root@qfedu.com ~]# [ ‐z "$var2" ];echo $?
0
[root@qfedu.com ~]# [ ‐z "$var3" ];echo $?
0
[root@qfedu.com ~]# [ ‐n "$var1" ];echo $?
0
[root@qfedu.com ~]# [ ‐n "$var2" ];echo $?
参数 | 功能 | |
-z | 1 | 如果字符串s1的长度为0, 则测试条件为真 |
-n | 1 | 如果字符串s1的长度大于0, 则测试条件为真 |
sl | 如果字符串s1不是空字符串, 则测试条件为真 | |
=或== | s1=s2 | 如果s1等于s2, 则测试条件为真,“=”前后应有空格 |
!= | s1!=s2 | 如果s1不等于s2, 则测试条件为真 |
< | 1 | 如果按字典顺序s1在s2之前, 则测试条件为真 |
> | s1>s2 | 如果按自定顺序s1在s2之后, 则测试条件为真 |
1、注意
对于字符串的比较, 一定要将字符串加比引号后再比较。如[ -n "$string" ]
=与!=可用于判断两个字符串是否相同
2、字符串比较
# 提示: 字符串必须使用双引号
[root@qfedu.com ~]# [ "$USER" = "root" ];echo $?
0
[root@qfedu.com ~]# [ "$USER" == "root" ];echo $?
0
[root@qfedu.com ~]# BBB=""
[root@qfedu.com ~]# echo $#BBB
0
[root@qfedu.com ~]# [ ‐z "$BBB" ]
[root@qfedu.com ~]# echo $?
0
[root@qfedu.com ~]# [ ‐n "$BBB" ]
[root@qfedu.com ~]# echo $?
1
[root@qfedu.com ~]# var2=
[root@qfedu.com ~]#
[root@qfedu.com ~]# echo $#var1
3
[root@qfedu.com ~]# echo $#var2
0
[root@qfedu.com ~]# echo $#var3
0
[root@qfedu.com ~]# [ ‐z "$var1" ];echo $?
1
[root@qfedu.com ~]# [ ‐z "$var2" ];echo $?
0
[root@qfedu.com ~]# [ ‐z "$var3" ];echo $?
0
[root@qfedu.com ~]# [ ‐n "$var1" ];echo $?
0
[root@qfedu.com ~]# [ ‐n "$var2" ];echo $?
3、整数操作符
在[]和test中使用 | 在[[ ]]和(( ))中使用 | 说明 |
-eq | ==或= | 等于, 全拼为equal |
-nq | != | 不等于, 全拼为not equal |
-gt | > | 大于, 全拼为greater than |
-ge | >= | 大于等于, 全拼为greater equal |
-lt | < | 小于, 全拼为less than |
-le | <= | 小于等于, 全拼为less equal |
1、判断变量是不是数字
[root@qfedu.com ~]# num10=123 [root@qfedu.com ~]# num20=ssss1114ss [root@qfedu.com ~]# [[ "$num10" =~ ^[0 ‐9]+$ ]];echo $? 0 [root@qfedu.com ~]# [[ "$num20" =~ ^[0 ‐9]+$ ]];echo $? 1 |
[root@qfedu.com ~]# disk_use=$(df ‐P |grep '/$ ' |awk 'print $5 ' |awk ‐F% 'print $1 ') [root@qfedu.com ~]# [ $disk_use ‐gt 90 ] && echo "war......" [root@qfedu.com ~]# [ $disk_use ‐gt 60 ] && echo "war......" war...... [root@qfedu.com ~]# id ‐u 0 [root@qfedu.com ~]# [ $(id ‐u) ‐eq 0 ] && echo "当前是超级用户" 当前是超级用户 [alice@qfedu.com ~]$ [ $UID ‐eq 0 ] && echo "当前是超级用户" | | echo "you不是超级用户" you不是超级用户 |
3、C语言风格的数值比较
[root@qfedu.com ~]# ((1<2));echo $? 0 [root@qfedu.com ~]# ((1==2));echo $? 1 [root@qfedu.com ~]# ((1>2));echo $? 1 [root@qfedu.com ~]# ((1>=2));echo $? 1 [root@qfedu.com ~]# ((1<=2));echo $? 0 [root@qfedu.com ~]# ((1!=2));echo $? 一文彻底弄懂Linux-Shell编程 一文彻底弄懂 “CommonJs” 与 “EsModule” 区别 GIS风暴一文彻底弄懂数字地形(DEMDOMTDOMDSM)的区别与联系 |