脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - shell - shell 循环命令详解

shell 循环命令详解

2023-03-02 13:43zhbi98 shell

这篇文章给大家介绍了shell 循环命令的相关知识,包括for命令使用,c 风格 for 命令及while 命令等等,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

1. for 命令

1.1 for 命令的使用

bash shell 提供了 for 命令,可以创建一个遍历一系列值的循环。每次一轮循环都使用其中一个值来执行已定义好的一组命令。下面是 bash shell 中 for 命令的基本格式。

?
1
2
3
4
5
6
7
for var in list
do
    commands
done
 
还可以是这样的形式
for var in list; do

注意这里的 list 这不是 shell 的关键词,list 只是想说明这是由数值,字符,字符串所组成的列表,for 循环来遍历这个列表。

使用:

?
1
2
3
4
5
6
7
8
9
10
11
for i in a b c d e f
do
    echo "The char is: $i"
done
------------------------------
The char is: a
The char is: b
The char is: c
The char is: d
The char is: e
The char is: f
?
1
2
3
4
5
6
7
8
9
10
11
for name in Alabama Alaska Arizona Arkansas California Colorado
do
    echo The next state is $name
done
---------------------------------------------------------------
The next state is Alabama
The next state is Alaska
The next state is Arizona
The next state is Arkansas
The next state is California
The next state is Colorado

还可以在变量中加载值:

通常shell脚本遇到的情况是,你将一系列值都集中存储在了一个变量中,然后需要遍历变量中的整个列表。

?
1
2
3
4
5
6
str="hello, word"
 
for s in str
do
    echo "$s"
done

还可以在命令中加载值:

生成列表中所需值的另外一个途径就是使用命令的输出。可以用命令替换来执行任何能产生输出的命令,然后在 for 命令中使用该命令的输出。

?
1
2
3
4
5
6
file="file_name"
 
for f in $(cat $file)
do
    echo "$f"
done

1.2 for 命令面临的问题

for 循环可以遍历字符串列表,比如 Alabama Alaska Arizona Arkansas California Colorado,这很简单,但是如果字符串中夹杂着特殊字符,比如这样 this'll 那这就有些麻烦了,因为有些特殊字符在 shell 中存在其他的含义。为了解决这样的问题,字符串中需要加入反斜杠 \ 进行转义,比如这样 this\'ll。这时 shell 就可以识别出特殊字符了。
还有一个办法是将含有特殊字符的字符串使用双引号括起来,比如像这样 "this'll"

例如:

?
1
2
3
4
for s in I don\'t know if "this'll" work
do
    echo "word:$s"
done

1.3 更改字段分隔符

为什么需要更改字段分隔符呢?如果你需要输出一篇英文文章,英文文章内容自然存在单词间的空格,行与行之间的换行符,现在如果shell输出内容的字段分隔符是空格,那这会存在一个问题,就是输出内容时内容会排成一列,而不是一行一行的输出。造成这个问题的原因是特殊的环境变量 IFS ,叫作内部字段分隔符(internal field separator)。IFS 环境变量定义了bash shell用作字段分隔符的一系列字符。默认情况下,bash shell会将下列字符当作字段分隔符:

  • 空格
  • 制表符
  • 换行符
    如果bash shell在数据中看到以上这些字符中的任意一个,它就会假定这表明了列表中一个新数据字段的开始。

要解决这个问题,可以在 shell 脚本中临时更改 IFS 环境变量的值来限制被 bash shell 当作字段分隔符的字符,比如 IFS=$'\n',这样字段分隔符就被更改为换行了。这样 bash shell 就认为换行才是数据的结束,bash shell 会在数据值中忽略空格和制表符。

就像下面这样存储旧值,赋予临时修改值:

?
1
2
3
4
5
6
7
8
9
10
11
file="file_name"
 
IFS.OLD=$IFS
IFS=$'\n'
 
for f in $(cat $file)
do
    echo "$f"
done
 
IFS=$IFS.OLD

1.4 用通配符读取目录

可以用 for 命令来自动遍历目录中的文件。进行此操作时,必须在文件名或路径名中使用通配符。它会强制shell 使用文件扩展匹配。文件扩展匹配是生成匹配指定通配符的文件名或路径名的过程。在不知道所有的文件名,这个特性在处理目录中的文件时就非常有用。

从目录中加载出所有的文件和文件夹:

?
1
2
3
4
5
6
7
8
9
10
for file in /home/rich/test/*
do
    if [ -d "$file" ]
    then
        echo "$file is a directory"
    elif [ -f "$file" ]
    then
        echo "$file is a file"
fi
done

2. c 风格 for 命令

我们先来看看 C 语言代码中 for 循环的代码风格:

?
1
2
3
for (i = 0; i < 10; i++) {
    printf("The next number is %d\n", i);
}

以下是 bash shell 中 C 语言风格的 for 循环的基本格式:

?
1
2
3
for (( variable assignment ; condition ; iteration process ))
                   ↓↓↓
for (( a = 1; a < 10; a++ ))

C语言风格的 for 循环的格式会让 bash shell 脚本程序员摸不着头脑,因为它使用了C语言风格
的变量引用方式而不是shell风格的变量引用方式。
注意,有些部分并没有遵循 bash shell 标准的 for 命令:
变量赋值可以有空格
条件中的变量不以美元符开头
迭代过程的算式未用 expr 命令格式

使用 C 风格的 for 命令可以像 C 语言那样使用多个变量,例如下面这样:

?
1
2
3
4
for (( a=1, b=10; a <= 10; a++, b-- ))
do
    echo "$a - $b"
done

3. while 命令

while 命令的关键在于所指定的 test command 的退出状态码必须随着循环中运行的命令而改变。如果退出状态码不发生变化, while 循环就将一直不停地进行下去。最常见的 test command 的用法是用方括号来检查循环命令中用到的shell变量的值。

?
1
2
3
4
while test command
do
    other commands
done

实例:

?
1
2
3
4
5
while [ $a -gt 0 ]
do
    echo $a
    a=$[ $a - 1 ]
done

while 还可以haike使用多个测试命令

while 命令允许你在 while 语句行定义多个测试命令。只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环。

?
1
2
3
4
5
6
while echo $a
    [ $a -ge 0 ]
do
    echo "This is inside the loop"
    a=$[ $a - 1 ]
done

4. until 命令

until 命令和 while 命令工作的方式完全相反。 until 命令要求你指定一个通常返回非零退出状态码的测试命令。只有测试命令的退出状态码不为 0 ,bash shell 才会执行循环中列出的命令。一旦测试命令返回了退出状态码 0 ,循环就结束了。

?
1
2
3
4
until test command
do
    other commands
done

实例:

?
1
2
3
4
5
until [ $a -eq 0 ]
do
    echo $a
    a=$[ $a - 25 ]
done

5. 控制循环

有时我们在脚本中执行循环的过程中,我们需要根据特定的条件来及时的退出循环去执行其他的任务,所以我们要能够对循环进行条件上的控制,shell 中 break 命令,continue 命令能帮我们控制循环内部的情况。

5.1. break 命令

break 命令是退出循环的一个简单方法。可以用 break 命令来退出任意类型的循环,包括 while 和 until 循环。

在 shell 执行 break 命令时,它会尝试跳出当前正在执行的循环。
有时你在内部循环,但需要停止外部循环。 break 命令接受单个命令行参数值,break n 其中 n 指定了要跳出的循环层级。默认情况下, n 为 1 ,表明跳出的是当前的循环。如果你将 n 设为 2 , break 命令就会停止下一级的外部循环。

5.2. continue命令

continue 命令可以提前中止某次循环中的命令,但并不会完全终止整个循环。比如提前终止本次循环,进入下一次循环(当 shell 执行 continue 命令时,它跳过了 while 循环中余下的命令)。

到此这篇关于shell 循环命令详解的文章就介绍到这了,更多相关shell 循环命令内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/jf_52001760/article/details/121450578

延伸 · 阅读

精彩推荐
  • shellShell之免交互的实现

    Shell之免交互的实现

    本文主要介绍了Shell之免交互的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来...

    白雪滑落树梢10002023-02-28
  • shellvtune自动安装脚本分享

    vtune自动安装脚本分享

    这篇文章主要介绍了vtune自动安装脚本分享,需要的朋友可以参考下...

    脚本之家5702023-01-28
  • shellShell脚本8种字符串截取方法总结

    Shell脚本8种字符串截取方法总结

    这篇文章主要介绍了Shell脚本8种字符串截取方法总结,每个方法给出了实例代码和操作结果,一目了然,需要的朋友可以参考下...

    shell教程网7782023-02-22
  • shelllinux bash中too many arguments问题的解决方法

    linux bash中too many arguments问题的解决方法

    本文介绍下在linux bash shell中出现too many arguments问题的解决办法,有需要的朋友参考学习下...

    脚本之家5562022-12-21
  • shellshell实现自动备份mysql、整站数据的两个脚本分享

    shell实现自动备份mysql、整站数据的两个脚本分享

    这篇文章主要介绍了shell实现自动备份mysql、整站数据的两个脚本分享,使用了cron实现实现定时备份,并会自动删除N天前的备份,以及自动FTP上传到别的服务器...

    shell教程网9472023-02-09
  • shell批量转换目录下文件编码的shell脚本代码

    批量转换目录下文件编码的shell脚本代码

    分享一例shell脚本,实现可以批量转换目录下的文件编码,很实用的一个小shell,有需要的朋友参考下...

    shell教程网11882022-12-24
  • shellShell字符串比较相等、不相等方法小结

    Shell字符串比较相等、不相等方法小结

    这篇文章主要介绍了Shell字符串比较相等、不相等方法小结,本文直接给出代码,但代码中含有大量注释,需要的朋友可以参考下...

    shell教程网5552023-02-22
  • shell又拍云存储同步脚本

    又拍云存储同步脚本

    为了可以自动把网站上的css、js以及图片等静态资源放在又拍云存储上,访问速度明显提高不少,下面简单介绍下实现步骤,需要的朋友可以参考下...

    脚本之家10662022-12-24