06-控制流程

nobility 发布于 2023-11-16 03-Shell脚本编程 1070 次阅读


控制流程

条件分支

  • 要注意if后需要有空格分隔,then...fi就像其他编程语言中的大括号,若then写在后面需要在条件测试后需要加一个分号
if [ 条件测试 ]
then
	#code
fi
#也可以
if [ 条件测试 ]; then
	#code
fi


#配合else
if [ 条件测试 ]
then
	#code
else
	#code
fi

#配合else if
if [ 条件测试 ]; then
	#code
elif [ 条件测试 ]; then
	#code
elif [ 条件测试 ]; then
	#code
else
	#code
if

开关语句

  • 匹配项可以有多种形式
    • a):单个匹配为a字母
    • a|b):匹配ab
    • 也可以使用基础命令中的哪些扩展特殊字符,如:*?[]
case $var in	#var是变量
	match1 ) #code
	;;	#相当于brack,如果是 ;;& 才是没写brack的效果,若这两种形式都不写则会报错
	match2 ) #code
	;;	#相当于brack
	* ) #default,其实使用的是基础命令中扩展的特殊字符中的*号,代表任意匹配
esac

循环

循环中都可以使用brackconrinue语句

while循环

  • 要注意while后需要有空格分隔,do...done就像其他编程语言中的大括号,若do写在后面需要在条件测试后x需要加一个分号
while [ 条件测试 ]
do
#loop code
done
#也可以
while [ 条件测试 ]; do
#loop code
done

until循环

  • 与while循环相反,条件为假时才会循环,为真时跳出循环
until [ 条件测试 ]
do
#loop code
done
#也可以
until [ 条件测试 ]; do
#loop code
done

for...in循环

  • seq:序列,该命令可以返回一个数字列表,可以用于该类型的循环中的列表
    • 单个参数:默认从1开始,生成到该参数的数字连序的序列
    • 两个参数:第一个参数指定起始位置(可以为负数),第二个参数指定结束位置(可以为负数),生成该范围内数字连序的序列
    • 三个参数:第一个参数指定起始位置,第二个参数指定步长,第三个参数指定结束位置,生成该范围内的按照步长的连序序列
for $var in list	#var是变量,是将in后的list列表挨个取出赋给var变量,list是 val1 val2 ... 的形式
do						  #所以遍历数组时需要使用 arr[*] 取出所有元素
#loop code			 #所以可以使用基础命令中的哪些扩展特殊字符,如{1..5}
done					  #一些命令也会返回列表形式,如ls,所以可以直接遍历
#也可以
for $var in list; do
#loop code
done

for循环

  • 与其他编程语言一样都有相同的for循环结构,只不过是形式不同,是两重小括号
  • 这种形式同样可以用于while循环
for ((i=1;i<5;i++))
do
  echo $i
done
#也可以
for ((i=1;i<5;i++)); do
  echo $i
done

条件测试

条件测试的三种形式

多个测试条件可以使用&&||来连接,条件测试也可以使用!取反

  • [ 条件测试 ]:注意方括号两边有空格
  • test 条件测试test是一个命令
  • [[ 条件测试 ]]:支持正则匹配,等于正则时使用=~号是正则匹配

字符串测试

条件测试 描述
[ str=str ][ str==str ] 相等
[ str!=str ] 不相等
[ -z str ] 空字符串
[ -n str ][ str ] 非空字符串

整数测试

可以使用(())代替以下的大小判断,比如:((2 > 1)),此时就不需要注意括号两端的空格了,这就更像主流的编程语言了,for和while循环使用该形式也是主要用了(())表达式

条件测试 描述
[ int -eq int ] 数值相等
[ int -ne int ] 数值不等
[ int -le int ] 数值小于等于
[ int -lt int ] 数值小于
[ int -ge int ] 数值大于等于
[ int -gt int ] 数值大于

文件测试

条件测试 描述
[ -e file ] 文件存在
[ -d file ] 文件存在且是目录
[ -f file ] 文件存在且是普通文件
[ -L file ] 文件存在且是连接文件
[ -r file ] 文件存在且有可读权限
[ -w file ] 文件存在且有可写权限
[ -x file ] 文件存在且有可执行权限
[ file1 -nt file2 ] file1更新时间更新于file2,或file1存在file2不存在
[ file1 -ot file2 ] [ file1 -nt file2 ]相反
[ file1 -ef file2 ] file1与file2是否互为硬连接
加油啊!即便没有转生到异世界,也要拿出真本事!!!\(`Δ’)/
最后更新于 2023-11-16