Shell脚本编程基础第八天之--循环

114 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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]dodone这三个部分是必须的,而且顺序绝对,但是可以随意分布在同一行or不同一行,但是如果在同一行则必须用;分号分割

vim 11-2.sh

image.png

bash 11-2.sh 首先四行输出了脚本普通循环的内容,接下来的全都是ps -eo这个命令的内容

image.png

往下滑就会发现输出有点问题

脚本输出命令如下:(被分割了内容)

image.png

命令行直接ps -eo command输出如下:(原始命令)

image.png

那么如何解决???使用IFS命令

image.png

简单来说我们原来的脚本是以空格分割的,比如/usr/bin/lsmd -d就会被分割成/usr/bin/lsmd-d两部分,但其实我们需要以换行符\n分割才对

脚本应该改成

IFS=$'\n'
for f in $(ps -eo command) ; do
    echo "$f"
done

image.png

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

image.png

image.png

until循环:说实话,我在java里面没遇到过这玩意儿,不过依稀记得在oracle里面遇到过
说明:until条件为假时,执行循环体内代码。为真时,跳过循环体代码段。\

#基本结构
until [ condition ]
do
    command(s) ...
done

通俗一点的语言:until可以直接理解为“直到”,可以理解为:直到条件为真就跳出循环,否则一直执行循环体

image.png

image.png

循环控制

  • break 跳过本层循环体剩余部分代码并返回上一级代码片段
  • continue 跳过本次循环执行剩余部分代码,继续执行下一次循环条件表达式计算判断

第一个例子:num从0开始+1,当num==3时退出循环 第一个例子:num从0开始+1,当num==3时跳过一次循环

image.png

image.png

基本上没什么特殊的,跟我们平时编程的break于continue一模一样,而且就俩关键字,没什么格式而言