Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux bash-one-liner的奇怪输出_Linux_Bash_Glob_Brace Expansion - Fatal编程技术网

Linux bash-one-liner的奇怪输出

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 现在,

在学习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的一些值是我的主目录中的文件和目录的名称,我在主目录中,同时执行此脚本

我所期望的是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