自动化运维必备之Shell脚本的循环语句,超详细讲解!

2023-05-16

Shell编程之循环语句


自动化运维必备之Shell脚本的循环语句,超详细讲解!

  • Shell编程之循环语句
  • 前言
  • 1. for循环
  • 3. while循环和until循环
  • 4. 嵌套循环
  • 5. 循环语句中的break、exit和continue
    • 5.1 break的使用
    • 5.2 exit的使用
    • 5.3 continue的使用
  • 总结


前言


1. for循环

  • for循环经常使用在已经知道要进行多少次循环的场景

语法:

for  变量名  in  取值列表
do
	命令序列
done

3. while循环和until循环

  • while循环可以不断的执行某个程序,直到用户设置的条件完成为止,所以重点是条件,这种不定循环最常见的就是下面这两种格式了。

格式:

while循环:while的中文是【当…时】,所以这种方式说的是,当判断式/命令序列的条件成立时,就进行循环,直到命令序列/程序段落的条件不成立才停止。

while  [ 条件测试操作 ]
do						#do代表循环的开始
	判断式/命令序列
done 					#done代表循环的结束

until循环:这种方式恰恰和while循环相反,它指的是当判断式/命令序列的条件成立时,就终止循环,否则就会持续循环程序段落。

until  [ 条件测试操作 ]
do
	判断式/命令序列
done

2.实例

使用while完成猜数字游戏(0到1000之间的整数),可以通过RANDOM获取随机数,猜对结束,猜错继续。

#!/bin/bash

r_num=$[$RANDOM%1000]			<------生成随机数
count=0							<------用于记录输入次数,初始为0	
while true						<------使用不定循环while,(while true代表一直循环)
do
        read -p "请输入一个数字:" user_num	<------提示用户输入数字
        if [ $user_num -eq $r_num ]			<------如果判断成功然后执行下面的语句
        then
                echo 恭喜你猜对了!
                break						<------break可以跳出循环,后面再详细讲解
        elif [ $user_num -gt $r_num ]		<------输入小了进行提示
        then
                echo 你输入的数字太大了!
        else
                echo 你输入的数字太小了!		<------输入大了进行提示
        fi
        let count++							<------每输入一次将conut的值+1
done
        echo 你输入次数为:$count				<------统计的总数

实例:用户输入yes或者no的时候可以退出,否则会一直循环下去

#!/bin/bash

until [ "${yn}" == "yes" -o "${yn}" == "no" ]	<------条件为输入yes或者no,然后退出循环
do
        read -p "请输入yes执行程序/no停止程序: " yn	<------指定的代码块
done
~     

4. 嵌套循环

  • 在循环内部再使用一个循环称为嵌套循环

格式:

#!/bin/bash
for ((i=1;i<5;i++))
do
        echo${i}为外部循环
        for((j=1;j<4;j++))
        do
                echo -e "\t${j}为内部循环"
        done
done

5. 循环语句中的break、exit和continue

5.1 break的使用

  • 当满足条件的情况下break会跳出当前循环体,如下:
#!/bin/bash
for ((i=1;i<5;i++))
do      
        echo${i}为外部循环
        for((j=1;j<4;j++))
        do
            if [ $j -eq 3 ]			<------如果j的值为3
            then
                break				<------跳出当前循环(内部)
            fi  
        echo -e "\t${j}为内部循环"
        done
done

5.2 exit的使用

  • 当满足条件的情况下exit会直接退出当前脚本,如下:
#!/bin/bash
for ((i=1;i<5;i++))
do
        echo${i}为外部循环
        for((j=1;j<4;j++))
        do
            if [ $j -eq 3 ]					<------如果j的值为3
            then
                exit						<------结束当前脚本
            fi
        echo -e "\t${j}为内部循环"
        done
done

5.3 continue的使用

  • continue中止某次循环中的命令,但不会完全中止整个命令,如下:
#!/bin/bash
for ((i=1;i<5;i++))
do
        echo${i}为外部循环
        for((j=1;j<4;j++))
        do
            if [ $j -eq 2 ]		<------如果j的值为2
            then
                continue		<------中止循环中本次的命令,但不会完全中止整个循环或脚本
            fi
        echo -e "\t${j}为内部循环"
        done
done

总结

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动化运维必备之Shell脚本的循环语句,超详细讲解! 的相关文章

  • bash双括号问题

    我对 bash 脚本非常陌生 在使用双括号时遇到了问题 我似乎无法让它们在 Ubuntu Server 11 10 中工作 我的下面的脚本位于 if test sh 中 bin bash if 14 14 then echo FOO fi
  • 如何在Windows Git shell中运行./script.sh?

    也许这很尴尬 但是当我在 Git shell 中工作时 我无法在 Windows 上运行 sh 文件 也许我必须安装一些东西 但我认为 Git 会支持 bash 命令 我知道 Windows 不使用 sh 文件 我正在执行安装步骤游戏结束
  • 通过 SSH 将变量传递给远程脚本

    我正在通过 SSH 从本地服务器在远程服务器上运行脚本 首先使用 SCP 复制该脚本 然后在传递一些参数时调用该脚本 如下所示 scp path to script server example org another path ssh s
  • 如何在bash中仅提取两个字符串之间多行的第一个实例?

    我的文件是 abc 123 xyz abc 675 xyz 我想提取 abc 123 xyz 123 可以是任何东西 重点是我想要第一次出现 我尝试使用这个 sed n abc xyz p filename 但这给了我所有的例子 我怎样才能
  • Windows、Emacs、Git Bash 和 shell 命令

    Windows 7 Emacs 24 3 1 git 1 8 1 msysgit 1 我的等效 emacs 文件中有以下内容 if equal system type windows nt progn setq explicit shell
  • 向伪 shell (pty) 发出命令

    我尝试使用 subprocess popen os spawn 来运行进程 但似乎需要伪终端 import pty master slave pty openpty os write master ls l 应该发送 ls l 到从属终端
  • 在 shell 脚本中查找和替换

    是否可以使用 shell 在文件中搜索然后替换值 当我安装服务时 我希望能够在配置文件中搜索变量 然后在该值中替换 插入我自己的设置 当然 您可以使用 sed 或 awk 来完成此操作 sed 示例 sed i s Andrew James
  • 如何使用AWK脚本检查表的所有列数据类型? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在这里 我正在检查表中第一列的数据类型 但我想知道AWK中表的所有列数据类型 我尝试过 但只能获得一列数据类型 例如 Column 1
  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • Bash 脚本大小限制?

    我有一个 bash 脚本 在 RHEL 或 OS X 上运行时出现以下错误 第 62484 行 意外标记 换行符 附近出现语法错误 第 62484 行 o gz 这是一个自动生成的脚本 用于解决我公司使用的 Grid Engine 计算集群
  • 如何在lua中获取shell脚本的返回码?

    我正在lua中执行一个脚本 os execute sh manager scripts update system sh f 我想获得脚本的输出 如果退出状态为 7 则返回 7 I tried local output os execute
  • shell_exec 的输出被截断为 100 个字符

    当在 shell 中运行以下命令时 curl F file filename http 192 168 0 1 产生以下输出 Accuracy 0 0 1 classification Accuracy 0 0 1 classificati
  • 在bash中,是否有相当于“错误消息”的东西

    在 perl 中 您可以使用错误消息退出die some msg bash 中是否有等效的单个命令 现在 我正在使用命令来实现这一点 echo some msg exit 1 你可以很容易地自己推出 die echo 1 gt 2 exit
  • awk: hping: 打印 icmp 发起/接收之间的差异

    我有以下输出hping http ports su net hping在 OpenBSD 上 hping icmp ts www openbsd org HPING www openbsd org re0 129 128 5 194 icm
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • 有一种简单的方法可以忽略时间戳来区分日志文件吗?

    我需要比较两个日志文件 但忽略每行的时间戳部分 确切地说是前 12 个字符 有没有一个好的工具 或者一个聪明的 awk 命令 可以帮助我 根据您使用的 shell 您可以改变方法 Blair https stackoverflow com
  • 在 bash 中使用单个命令为 shell 变量分配默认值

    我对 bash 3 00 shell 脚本中的变量进行了大量测试 如果未设置变量 则它会分配默认值 例如 if z VARIABLE then FOO default else FOO VARIABLE fi 我似乎记得有一些语法可以在一行
  • git 别名中的 AWK 语句

    我正在尝试创建一个 git 别名来以特定格式打印日志中的所有拉取请求 但是 我在使用 AWK 删除双空格时遇到问题 这是使用以下命令的 git log 的输出 git log merges grep pull request pretty
  • 如何在 shell 脚本中操作 $PATH 元素?

    有没有一种惯用的方法从类似 PATH 的 shell 变量中删除元素 这就是我想要的 PATH home joe bin usr local bin usr bin bin path to app bin and remove or rep
  • 如何从 Artifactory 存储库下载最新的工件?

    我需要来自存储库的最新工件 例如快照 人工工厂 http en wikipedia org wiki Software repository Repository managers 该工件需要通过脚本复制到服务器 Linux 我有什么选择

随机推荐