Shell循环
04/19
本文最后更新于
2024年08月02日,已超过
211天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
每一种编程语言中循环结构都是一个重要的语法,shell也不例外。
shell中循环结构包括:for循环、while循环以及until循环。
这里只介绍常用的for循环和while循环。
for循环
for循环用于对一个对象列表中每个元素重复执行操作,其中对象列表可以是数值列表、文件名列表或者命令行参数列表等。
for循环语法
for var in 对象列表
do
statements
done
可以使用;
将多行语句写到一行:
for var in 对象列表; do
statements
done
或者
for var in 对象列表; do statements; done
shell还支持C语言风格的for循环
for ((exp1; exp2; exp3))
do
statements
done
常见用法:
- 数值列表
for i in 1 2 3 4 5 6 # 循环6次
do
echo $i
done
可以使用花括号展开生成数值列表
for i in {1..6}
do
echo $i
done
还可以使用seq
生成数值列表
for i in `seq 1 6`
do
echo $i
done
等价于C风格for循环
for ((i=1; i<=6; i++))
do
echo $i
done
注:花括号展开还支持生成步长不为1的等距间隔列表
for i in {1..9..2} # 1-9奇数 等价于 for i in `seq 1 2 9`
- 文件名列表
for file in *.txt
do
# process every file
done
- 遍历数组元素
Bash也支持数组变量,可以使用for循环对数组元素遍历。
years=(2010 2013 2020 2023)
for year in "${years[@]}" # 数组元素列表
do
echo $year
done
for i in "${!years[@]}" # 数组元素个数,通过下标索引访问元素
do
echo ${years[i]}
done
while循环
语法
while condition
do
statements
done
判断条件condition与if语句中判断条件一样,可以是简单的命令列表,也可以使用test
或[]
命令,也可以使用(())
或[[]]
。
示例:
- 读取文件每一行内容
while read -r line # 判断条件是普通命令
do
echo $line
done < a.txt
注意< a.txt
必须放在done
后面,如果放在read命令后面read -r line < a.txt
会只读取第一行且进入死循环。
- 通过管道方式读取文件:
cat a.txt | while read -r line
do
echo $line
done
- 查询slurm作业是否完成
query_job_max=300000 #定义查询作业最大次数
query_job=0
while [ $query_job -lt ${query_job_max} ] # 判断条件是test命令
do
squeue | grep $jobid # 查询作业队列中是否存在指定作业jobid
if [ $? != 0 ]; then
echo Job $jobid has finished
break # break跳出while循环
fi
query_job=$((query_job+1))
sleep 60
done

