您现在的位置是:首页 >技术杂谈 >Linux之 shell 流程控制(七)网站首页技术杂谈
Linux之 shell 流程控制(七)
简介Linux之 shell 流程控制(七)
1、条件判断
1、条件判断语法格式
格式1:test 条件表达式
格式2:[ 条件表达式 ]
格式3:[[ 条件表达式 ]]
2、条件判断相关参数
1、判断文件类型
判断参数 | 含义 |
---|---|
-e | 判断文件是否存在(任何类型文件) |
-f | 判断文件是否存在并且是一个普通文件 |
-d | 判断文件是否存在并且是一个目录 |
-L | 判断文件是否存在并且是一个软连接文件 |
-b | 判断文件是否存在并且是一个块设备文件 |
-S | 判断文件是否存在并且是一个套接字文件 |
-c | 判断文件是否存在并且是一个字符设备文件 |
-p | 判断文件是否存在并且是一个命名管道文件 |
-s | 判断文件是否存在并且是一个非空文件(有内容) |
[root@yhm ~]# cd a
[root@yhm a]# test -e a.txt
[root@yhm a]# echo $?
0
[root@yhm a]# test -e b.txt
[root@yhm a]# echo $?
1
[root@yhm a]# cd
[root@yhm ~]# [ -d a ]
[root@yhm ~]# echo $?
0
[root@yhm ~]# [ ! -d a ]
[root@yhm ~]# echo $?
1
[root@yhm ~]# [ ! -d b ]
[root@yhm ~]# echo $?
0
[root@yhm ~]# [[ -f a/a.txt ]]
[root@yhm ~]# echo $?
0
2、判断文件权限
参数 | 含义 |
---|---|
-r | 当前用户对其是否可读 |
-w | 当前用户对其是否可写 |
-x | 当前用户对其是否可执行 |
-u | 是否有suid,高级权限冒险位 |
-g | 是否有sgid,高级权限强制位 |
-k | 是否有t位,高级权限粘滞位 |
3、判断文件新旧
注:这里的新旧指的是文件的修改时间
参数 | 释义 |
---|---|
file1 -nt file2 | 比较 file1 是否比 file2 新 |
file1 -ot file2 | 比较 file1 是否比 file2 旧 |
file1 -ef file2 | 比较是否为同一个文件,或者用于判断硬连接,是否指向同一个 inode |
4、判断整数
参数 | 释义 |
---|---|
-eq | 相等 |
-ne | 不等 |
-gt | 大于 |
-lt | 小于 |
-ge | 大于等于 |
-le | 小于等于 |
5、判断字符串
参数 | 含义 |
---|---|
-z | 判断是否为空字符串,字符串长度为0则成立 |
-n | 判断是否为非空字符串,字符串长度不为0则成立 |
string1 = string2 | 判断字符串是否相等 |
string1 | = string2 |
6、多重条件判断
参数/符号 | 含义 |
---|---|
-a 和 && | 逻辑与 |
-o 和 |
使用说明:
&&:前面的表达式为真,才会执行后面的代码
||:前面的表达式为假,才会执行后面的代码
;:只用于分割命令或表达式
1、数值比较:
[root@yhm ~]# echo $(id -u)
0
[root@yhm ~]# echo &id
[1] 542201
uid=0(root) gid=0(root) 组=0(root)
[1]+ 已完成 echo
[root@yhm ~]# [ $(id -u) -eq 0 ] && echo "the user is admin"
the user is admin
[root@yhm ~]# [ $(id -u) -ne 0 ] && echo "the user is not admin"
[root@yhm ~]# [ $(id -u) -eq 0 ] && echo "the user is admin" || echo "the user is not admin"
the user is admin
[root@yhm ~]# uid=`id -u`
[root@yhm ~]# test $uid -eq 0 && echo this is admin
this is admin
[root@yhm ~]# [ $(id -u) -ne 0 ] || echo this is not admin
this is not admin
[root@yhm ~]# [ $(id -u) -ne 0 ] && echo this is admin || echo this is not admin
this is not admin
[root@yhm ~]# su - centos
[centos@yhm ~]$ [ $(id -u) -eq 0 ] && echo this is admin || echo this is not admin
this is not admin
2、类C风格的数值比较
注:在(())中,=表示赋值,==表示判断
[root@yhm centos]# ((1==2));echo $?
1
[root@yhm centos]# ((1<2));echo $?
0
[root@yhm centos]# ((2>=1));echo $?
0
[root@yhm centos]# ((2!=1));echo $?
0
[root@yhm centos]# ((`id -u`));echo $?
1
[root@yhm centos]# ((`id -u`==0));echo $?
0
[root@yhm centos]# ((a=123));echo $a
123
[root@yhm centos]# unset a
[root@yhm centos]# ((a==123));echo $?
1
3、字符串比较
注:双引号引起来,看作一个整体。= 和 == 在 [ 字符串 ] 比较中都表示判断
[root@yhm centos]# a='hello world';b=world
[root@yhm centos]# [ $a = $b ];echo $?
bash: [: 参数太多
2
[root@yhm centos]# [ "$a" = "$b" ];echo $?
1
[root@yhm centos]# [ "$a" != "$b" ];echo $?
0
[root@yhm centos]# [ "$a" !== "$b" ];echo $?
bash: [: !==: 需要二元表达式
2
[root@yhm centos]# [ "$a" == "$b" ];echo $?
1
[root@yhm centos]# test "$a" != "$b"
[root@yhm centos]# echo $?
0
4、test 表达式、[ 表达式 ]、[[ 表达式 ]]
[root@yhm centos]# a=
[root@yhm centos]# test -z $a;echo $?
0
[root@yhm centos]# a=hello
[root@yhm centos]# test -z $a;echo $?
1
[root@yhm centos]# test -n $a;echo $?
0
[root@yhm centos]# test -n "$a";echo $?
0
[root@yhm centos]# [ '' = $a ];echo $?
1
[root@yhm centos]# [[ '' = $a ]];echo $?
1
[root@yhm centos]# [ 1 -eq 0 -a 1 -ne 0 ];echo $?
1
[root@yhm centos]# [ 1 -eq 0 ] && [ 1 -ne 0 ];echo $?
1
[root@yhm centos]# [[ 1 -eq 0 ]] && [[ 1 -ne 0 ]];echo $?
1
5、逻辑运算符总结
1、符号 ;、&&、|| 都可以用来分隔命令或者表达式
2、分号(;)完全不考虑前面的语句是否正确执行,都会执行分号后面的内容
3、&& 符号,需要考虑 && 前面的语句的正确性,前面的语句正确执行才会执行 && 后的内容
4、|| 符号,需要考虑 || 前面的语句的非正确性,前面的语句执行错误才会执行 || 后的内容
5、如果 && 和 || 一起出现,从左往右依次看,按照以上原则
2、流程控制语句
1、if 语句
1、if 结构
if condition
then
command1
command2
...
command
fi
2、if…else 结构
if condition
then
command1
command2
...
commandN
else
command
fi
3、if…elif…else 结构
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
2、case 语句
case var in # 定义变量;var代表是变量名
pattern 1) # 模式1;
command1 # 需要执行的语句
;; # 两个分号代表命令结束
pattern 2)
command2
;;
pattern 3)
command3
;;
default
command4
;;
esac # esac表示case语句结束
3、for 循环语句
1、列表循环
列表 for 循环,用于将一组命令执行已知的次数。基本语法格式:
for variable in {list}
do
command
command
…
done
或者
for variable in a b c
do
command
command
done
[root@yhm centos]# for var in {1..10};do echo $var;done
1
2
3
4
5
6
7
8
9
10
[root@yhm centos]# for var in 1 2 3 4 5;do echo $var;done
1
2
3
4
5
[root@yhm centos]# for var in `seq 10`;do echo $var;done
1
2
3
4
5
6
7
8
9
10
[root@yhm centos]# for var in $(seq 10);do echo $var;done
1
2
3
4
5
6
7
8
9
10
[root@yhm centos]# for var in {0..10..2};do echo $var;done
0
2
4
6
8
10
[root@yhm centos]# for var in {2..10..2};do echo $var;done
2
4
6
8
10
[root@yhm centos]# for var in {10..1};do echo $var;done
10
9
8
7
6
5
4
3
2
1
[root@yhm centos]# for var in (10..1..-2);do echo $var;done
bash: 未预期的符号 `(' 附近有语法错误
[root@yhm centos]# for var in {10..1..-2};do echo $var;done
10
8
6
4
2
[root@yhm centos]# for var in `seq 10 -2 1`;do echo $var;done
10
8
6
4
2
2、不带列表循环
不带列表的 for 循环执行时由用户指定参数和参数的个数。基本语法格式:
for variable
do
command
command
…
done
[root@yhm ~]# vim 1.sh
#!/bin/bash
for var
do
echo $var
done
echo "脚本后面有$#个参数"
[root@yhm ~]# bash 1.sh 1 2 3
1
2
3
脚本后面有3个参数
3、类 C 风格的 for 循环
for(( expr1;expr2;expr3 ))
do
command
command
…
done
expr1:定义变量并赋初值
expr2:决定是否进行循环(条件)
expr3:决定循环变量如何改变,决定循环什么时候退出
[root@yhm ~]# vim 1.sh
#!/bin/bash
for ((i=1;i<=5;i++))
do
echo $i
done
[root@yhm ~]# bash 1.sh
1
2
3
4
5
[root@yhm ~]# for ((i=1;i<=5;i++));do echo $i;done
1
2
3
4
5
[root@yhm ~]# for ((i=1;i<=10;i+=2));do echo $i;done
1
3
5
7
9
[root@yhm ~]# for ((i=2;i<=10;i+=2));do echo $i;done
2
4
6
8
10
4、while 循环语句
特点:条件为真就进入循环,条件为假就退出循环
while 表达式
do
command...
done
while [ 1 -eq 1 ] 或者 (( 1 < 2 ))
do
command
command
...
done
[root@yhm ~]# vim 1.sh
#!/bin/bash
i=1
while [ $i -le 5 ]
do
echo $i
let i++
done
[root@yhm ~]# bash 1.sh
1
2
3
4
5
5、until 循环
特点:条件为假时进入循环,条件为真时退出循环
until expression [ 1 -eq 1 ] (( 1 >= 1 ))
do
command
command
...
done
[root@yhm ~]# vim 1.sh
#!/bin/bash
i=1
until [ $i -gt 5 ]
do
echo $i
let i++
done
[root@yhm ~]# bash 1.sh
1
2
3
4
5
6、循环控制语句
continue:表示循环体内下面的代码不执行,重新开始下一次循环
break:马上停止执行本次循环,执行循环体后面的代码
exit:表示直接跳出程序
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。