持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情
在之前条件判断那一章节其实就用到了循环,只是没有正式介绍……
for循环:基本跟主流编程语言的for循环大同小异,在[]里面放需要循环的数组,for后面跟数组遍历出来的单个元素,do即为开始执行命令的入口标志,done即为结束执行命令的标志。
# 基本结构
for arg in [list]
do
command(s)...
done
#单行结构
for arg in [list];do command(s)...;done
其实两种结构基本就是一致的,只不过单行结构加了分号区分命令而已;
实例
# 普通循环
NAMES=(吕奉先 曹阿瞒 关云长 孙伯符)
for N in ${NAMES[@]}
do
echo "My name is $N"
done
# 命令循环:输出ps -eo这个命令
for f in $(ps -eo command) ; do
echo "$f"
done
从上面可以看到,第二个命令循环即使不是单行结构也用到了;分号,从这我们就可以猜出
for arg in [list]、do、done这三个部分是必须的,而且顺序绝对,但是可以随意分布在同一行or不同一行,但是如果在同一行则必须用;分号分割
vim 11-2.sh
bash 11-2.sh 首先四行输出了脚本普通循环的内容,接下来的全都是ps -eo这个命令的内容
往下滑就会发现输出有点问题
脚本输出命令如下:(被分割了内容)
命令行直接ps -eo command输出如下:(原始命令)
那么如何解决???使用IFS命令
简单来说我们原来的脚本是以空格分割的,比如/usr/bin/lsmd -d就会被分割成/usr/bin/lsmd与-d两部分,但其实我们需要以换行符\n分割才对
脚本应该改成
IFS=$'\n'
for f in $(ps -eo command) ; do
echo "$f"
done
while循环:shell里面是没有dowhile循环的,如果实在想用只能以while循环+条件判断来模拟
# 基本结构
while[ condition ]
do
command(s)...
done
# 模拟 do .. while 循环
while[ : ];do
if [ condition ];then
break
fi
command (s)...
done
实例:
1.这里要尤为注意的一点,中括号里面的空格非常重要,没有空格就会报错;
2.-gt -eq在上一节已经讲过了,分别是大于、等于;
3.冒号在Linux中是一个空命令,可以认为与shell的内建命令true相同,它的返回值是0
COUNT=4
while [ $COUNT -gt 0 ]; do
echo "value of count is: $COUNT"
COUNT=$(($COUNT - 1))
done
NUM=4
while [ : ]; do
echo "value of NUM is: $NUM"
NUM=$(($NUM - 1))
if [[ $NUM -eq 0 ]];then
break
fi
done
until循环:说实话,我在java里面没遇到过这玩意儿,不过依稀记得在oracle里面遇到过
说明:until条件为假时,执行循环体内代码。为真时,跳过循环体代码段。\
#基本结构
until [ condition ]
do
command(s) ...
done
通俗一点的语言:until可以直接理解为“直到”,可以理解为:直到条件为真就跳出循环,否则一直执行循环体
循环控制
- break 跳过本层循环体剩余部分代码并返回上一级代码片段
- continue 跳过本次循环执行剩余部分代码,继续执行下一次循环条件表达式计算判断
第一个例子:num从0开始+1,当num==3时退出循环 第一个例子:num从0开始+1,当num==3时跳过一次循环
基本上没什么特殊的,跟我们平时编程的break于continue一模一样,而且就俩关键字,没什么格式而言