shell 循环命令[通俗易懂]

shell 循环命令[通俗易懂]1.for命令1.1for命令的使用bashshell提供了for命令,可以创建一个遍历一系列值的循环。每次一轮循环都使用其中一个值来执行已定义好的一组命令。下面是bashshell中for命令的基本格式。forvarinlistdocommandsdone还可以是这样的形式forvarinlist;do注意这里的list这不是shell的关键词,list只是想说明这是由数值,字符,字符串所组成的列表,for循环来遍历这

大家好,又见面了,我是你们的朋友全栈君。

1. for 命令

1.1 for 命令的使用

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

for var in list
do
    commands
done

还可以是这样的形式
for var in list; do

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

使用:

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
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脚本遇到的情况是,你将一系列值都集中存储在了一个变量中,然后需要遍历变量中的整个列表。

str="hello, word"

for s in str
do
	echo "$s"
done

还可以在命令中加载值:

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

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"

例如:

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 会在数据值中忽略空格和制表符。

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

file="file_name"

IFS.OLD=$IFS
IFS=$'\n'

for f in $(cat $file)
do
	echo "$f"
done

IFS=$IFS.OLD

1.4 用通配符读取目录

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

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

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 循环的代码风格:

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

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

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 语言那样使用多个变量,例如下面这样:

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

3. while 命令

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

while test command
do
	other commands
done

实例:

while [ $a -gt 0 ]
do
	echo $a
	a=$[ $a - 1 ]
done

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

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

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 ,循环就结束了。

until test command
do
	other commands
done

实例:

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 循环中余下的命令)。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/163937.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Java打印数组的四种方式「建议收藏」

    Java打印数组的四种方式「建议收藏」1.使用循环结构这里使用的是for循环publicclassPrintArrays{ publicstaticvoidmain(String[]args){ int[]a={1,2,3,4,5}; for(inti=0;i<a.length;i++){ System.out.print(a[i]+”\t”); } }}…

  • 将headers请求头字符串转为字典

    将headers请求头字符串转为字典

  • 爱的最高境界

    爱的最高境界

  • 学习双拼必看:双拼输入法的心得以及快速入门办法

    学习双拼必看:双拼输入法的心得以及快速入门办法1.简单介绍一下双拼2.总共18种双拼方案3.15种双拼方案的具体映射4.顺便提一下双拼口诀的事情5.总结不同平台选择的方案双拼(也称双打)是一种建立在拼音输入法基础上的输入方法,可视为全拼的一种改进,它通过将汉语拼音中每个含多个字母的声母或韵母各自映射到某个按键上,使得每个音都可以用两个按键打出,极大地提高了拼音输入法的输入速度。这种声母或韵母到按键的对应表通常称之为双…

  • Java的注解

    Java的注解一、注解的概念:注解并不是一开始就有的,JDK5之前是没有注解的,JDK5及其以后JDK版本才开始支持Java注解!Java注解(Annotation)也叫做元数据,以@注解名在代码中存在,它是一种在源代码中标注的特殊标记,可以标注源代码中的类、属性、方法、参数等代码,主要用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。1.1Java注解按照含有参数的个数分为三种:不带参数,语法结构为:@Annotation,例如@FunctionalInterface;带一个参数的注解,语

  • 安捷伦频谱仪详解_安捷伦频谱仪工作原理

    安捷伦频谱仪详解_安捷伦频谱仪工作原理R3131A频谱仪简单操作使用方法一.R3131A频谱仪简介。R3131A频谱仪是日本ADVANTEST公司的产品,用于测量高频信号,可测量的频率范围为9K—3GHz。对于GSM手机的维修,通过频谱仪可测量射频电路中的以下电路信号,(维修人员可以通过对所测出信号的幅度、频率偏移、干扰程度等参数的分析,以判断出故障点,进行快速有效的维修):1.手机参考基准时钟(13M,26M等);2.射频本振…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号