从bash一班班轮奇怪的输出
收藏

在学习BASH的过程中,我经常调整现有的事物并看到它的输出。

~$ for i in {1..19}; do echo "Everything in UNIX is a file."; sleep 1; done

我有这个,出于好奇,我把上面的一个调整成如下:
~$ for i in {1..19 * 2}; do echo "Everything in UNIX is a file."; echo "The value of i is ${i}";  sleep 1; done

现在让我惊讶的是,我开始得到以下输出:
Everything in UNIX is a file.
The value of i is OneDrive
Everything in UNIX is a file.
The value of i is opera autoupdate
Everything in UNIX is a file.
The value of i is Personal_Workspace
Everything in UNIX is a file.
The value of i is Pictures
Everything in UNIX is a file.
The value of i is PrintHood
Everything in UNIX is a file.
The value of i is Recent
Everything in UNIX is a file.
The value of i is Roaming
Everything in UNIX is a file.
The value of i is Saved Games
Everything in UNIX is a file.
The value of i is Searches

我的一些值是主目录中文件和目录的名称,我在主目录中,同时执行这个脚本。
我所期望的i值范围是1到19*2=38,所以取1,2,3…30…38的值。
但显然不是为什么?


最佳答案:

是的,在bash中,范围扩展比其他任何事情都要早。您预期会发生算术展开,但由于展开的顺序bashshell而没有按预期发生。您的代码最终将{1..19*2}解释为文本字符串。
因为*在shell中有一个特殊的含义,它是一个全局扩展,列出当前文件夹中的所有文件/目录。此外,您还可以看到一个条目说明了其他两个字符串的字面解释。
man bash(1)页的Expansion部分
展开的顺序是:大括号展开、颚化符展开、参数、变量和算术展开以及命令替换(以从左到右的方式完成)、分词和路径名展开。
如果您再次将bourne的脚本作为shell的目标,那么最好使用for循环和((..))构造

for ((i=1; i<=38; i++)); do

公众号