Linux bash-one-liner的奇怪输出
在学习bash的过程中,我经常调整现有的东西并查看它的输出Linux bash-one-liner的奇怪输出,linux,bash,glob,brace-expansion,Linux,Bash,Glob,Brace Expansion,在学习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 现在,
~$ 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的一些值是我的主目录中的文件和目录的名称,我在主目录中,同时执行此脚本
我所期望的是I值的范围是1到19*2=38,所以我将取1,2,3…30…38的值。
但很明显,这不是为什么?unix shell中的
*
符号转换为通配符,因此基本上{1..19*2}
的意思是1到19,当前目录中的所有文件(即*),而不是2。这些将是循环中i的值在bash
中是,范围扩展发生在所有其他事情之前。您预期会发生算术扩展,但由于扩展顺序bash
shell,该扩展没有按预期发生。您的代码最终将{1..19
、*
和2}
解释为文本字符串
因为*
在shell中有一个特殊的含义,它是一个全局扩展,列出当前文件夹中的所有文件/目录。此外,您还可以看到一个条目说明了其他两个字符串的字面解释
从扩展部分下的页面
展开顺序为:大括号展开、平铺展开、参数展开、变量和算术展开以及命令替换(以从左到右的方式完成)、分词和路径名展开
如果您再次针对bourne shell的脚本,则最好使用带有(…)
构造的for
循环
for ((i=1; i<=38; i++)); do
for((i=1;Itis)(不完全是,它不会从1循环到19,而是将“{1..19”视为一个字符串)。尝试使用+
而不是*
来更清楚地查看输出。这将输出“{1..19”,然后是“+”,最后是“2}。实际上,值首先是{1..19
然后是所有文件的第二个,然后是第三个2}
这是一个很好的答案,因为您添加了关于文字字符串的部分:)+1