在bash中对数组进行循环操作,并对每个部分进行了详尽的语法解释
for循环是一个相对简单的概念,但是我想在这里分解一下语法,因为在引擎盖下,bash是非常多的,我不能不强调这一点,它不是C语言。我试图看看引擎盖下发生了什么,这样当我从StackOverflow上复制粘贴时,它不能工作,我可以真正解决故障。
你可以像这样在bash中循环浏览数组
array=(thing1 thing2)
如果你想对数组进行迭代,一个简单的方法就是像这样。
xvalues=(x1, x2, x3)
基本上,你可以重复使用同一个索引来访问两个数组。
为了简单起见,让我们把这第一个分解一下。
array=(thing1 thing2)
通常bash中的括号表示所谓的 "子壳"。
引用 "man bash "页面的说法。
(list) list is executed in a subshell environment (see COMMAND EXECUTION ENVIRONMENT below). Variable assignments and builtin commands that affect the shell's environment do not remain in effect after the command completes. The return status is the exit status of list.
这实际上是相当可移植的,并不只限于bash 。POSIX Shell命令语言规范对(compound-list) 语法有如下描述。
在子壳环境中执行复合列表;见外壳执行环境。影响环境的变量赋值和内置命令在列表结束后不应继续生效。
所以基本上,你在这里调用了一个小的subshell,它有点像调用一个小的子程序或类似的东西,在这个意义上,它返回的东西就像一个子程序。
让我们看一下这个
分组命令
分组命令的格式如下。
(compound-list) 在子壳环境中执行compound-list,见Shell 执行环境。影响环境的变量赋值和内置命令在列表结束后不得继续生效。
如果一个以"(() "开头的字符序列在前面加上'$'的话会被shell解析为算术扩展,那么实现了扩展的shell可以将"((表达式) "作为一个算术表达式来评估,而不是作为一个分组命令来介绍。符合要求的应用程序应确保它用空白分隔两个领先的'('字符,以防止shell执行算术评估。
{compound-list; }在当前的进程环境中执行compound-list。这里显示的分号是控制操作符为**}**保留字定界的一个例子。其他定界符也是可能的,如Shell语法中所示;经常被使用。
所以基本上有两种类型的复合列表,一种是在子壳环境中执行,另一种是在当前进程环境中执行。
所以。
- $()是命令的替换。
- ${}是我们如何获得一个变量的值
- ()是一个子shell,它执行后会返回一个值。
子壳中的变量在子壳中的代码块之外是不可见的。它们对于父进程和启动子壳的shell来说是不可访问的。实际上,这些是局部变量。
这意味着如果你想的话,你可以在子壳中声明局部变量并进行局部计算来计算你的列表
- {;}是在当前shell环境下的一个复合列表,我还不确定这将被用于什么,也许我可以在另一篇文章中介绍。
好了,脚本的下一行。
for i in "${!array[@]}"; do
所以在这里我们声明了for循环,非常好。
- ! 的情况下,用于 "间接引用"。(不像它通常被用作反转bool的否定操作符)。
这里的文档表明。
Bash中的间接引用是一个多步骤的过程。首先,取一个变量的名字:varname。然后,引用它:varname。然后,转义第一个。\\$$varname。最后,强制对表达式进行重新评估,并将其赋值:**eval newvar=\\varname**。
变量的间接引用有什么实际用处?它为Bash提供了C语言中指针的一些功能,例如,在表格查询中。而且,它还有一些其他非常有趣的应用。. . .t
所以我们有了它, 我们引用了一个引用, 然后重新评估它以获得一个数组中的指针的行为.
- @是用来迭代位置参数的。你可以把它想象成一个迭代器,在传递给它的列表中跳动。它把传递给它的参数看作是独立的字。
- ;是一个命令分隔符
- do关键字用于循环位置参数(本例中是我们传入的数组的内容),do在while和until循环中也是必要的。
好的,让我们进入下一行
echo ${array[$i]}
- ${}用于获取一个变量的值
- []--单括号是指数组的索引
- echo是用来打印到命令行的。
好的,让我们进入下一行。
done
- done关键字只是结束for循环
好了,我们现在应该对bash的实际操作有了更多的了解,这很好!