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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vs2008安装失败解决办法「建议收藏」

    vs2008安装失败解决办法「建议收藏」

    由于各种蛋疼原因,卸载了VS2010换08.比较痛恨的是VS的卸载总是卸不干净,这种问题对于微软来说很难吗??
    开始还以为装不上08是因为2010没有卸载干净,结果搜索后发现时office2007的问题。
    代码:[01/13/10,18:55:42] setup.exe: [2] ISetupComponent::Pre/Post/Install() failed in ISetupManager::InternalInstallManager() with H

    2025年9月29日
    6
  • CodeIgniter安装和入门使用(一)[通俗易懂]

    CodeIgniter安装和入门使用(一)

    2022年2月8日
    50
  • 数据库ER图基础概念知识

    数据库ER图基础概念知识ER图分为实体、属性、关系三个核心部分。实体是长方形体现,而属性则是椭圆形,关系为菱形。ER图的实体(entity)即数据模型中的数据对象,例如人、学生、音乐都可以作为一个数据对象,用长方体来表示,每个实体都有自己的实体成员(entitymember)或者说实体对象(entityinstance…

    2022年6月21日
    34
  • 手机版java编译器_Java编译器[通俗易懂]

    手机版java编译器_Java编译器[通俗易懂]这是一款专为学习Java的学员们打造的一款非常优质的程序验证软件,让用户能够非常快速的复制自己的程序到APP中,进行检验,能够非常快速的去验证程序的内容,能够非常及时的进行纠错,让你的代码能够及时的得到解决,用户可以随时在这里打开使用,保证自己的编辑的代码能够更加的完美,让你可以更好的精心纠错,对于初学者来说是一款非常棒的软件,让自己能够学的更好,经验能够更加的丰富。软件特点验证代码非常简单快捷,…

    2022年7月13日
    21
  • js:如何获取select选中的值

    js:如何获取select选中的值我想获取select选中的value,或者text,或者……比如这个:<selectid=”select”><optionvalue=”A”url=”http://www.baidu.com”>第一个option</option><optionvalue=”B”url=”http://www.qq.com”>第二个option</option></select>一:JavaScript原生的…

    2025年8月10日
    4
  • 区块链关键技术点在应用实践中的解决方案

    区块链关键技术点在应用实践中的解决方案

    2021年5月27日
    114

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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