提问人:William Pursell 提问时间:4/20/2018 最后编辑:William Pursell 更新时间:4/20/2018 访问量:116
为什么在 'for i do cmd 中不需要分隔符;done' [复制]
Why is a separator not required in `for i do cmd; done` [duplicate]
问:
for i do echo $i; done
这怎么合法?(我希望它用额外的分号写成)它适用于 bash、dash、zsh 和 ksh。标准(我的意思是 http://pubs.opengroup.org/onlinepubs/9699919799/)规定:for i; do echo $i; done
The for loop requires that the reserved words do and done be used to
delimit the sequence of commands. The format for the for loop is as follows:
for name [ in [word ... ]]
do
compound-list
done
因此,当省略“in word”时,很明显是作为分隔符。因此,含义似乎是 之后的分隔符(换行符)实际上属于右括号内。有人可以指出标准中的任何内容来证明这种(IMO)对语言的可怕滥用是合理的吗?do
[ in [word .. ]]
答:
1赞
John Moon
4/20/2018
#1
也许其他人可以填写语法的历史记录,但在 shell 脚本中,空格字符(默认情况下)是分隔符。字符只是一个语句分隔符。它通常被用来代替换行符来将逻辑编写为“单行”。shell 脚本中行末尾的分号是多余的,因为两者都是命令分隔符。;
另外值得注意的是,上面的括号语法旨在表明语法的这些部分是可选的(即您实际上并没有在脚本中使用括号)。
最后,我发现将贝壳视为......好吧,贝壳。你可以用它们编写脚本,作为“语言”,它们是图灵完备的,但语法通常有点时髦。
评论
0赞
William Pursell
4/20/2018
好点:分隔符与分隔符。有趣的是,该标准使用了短语“do and done be used to delimit”,而“separate”本来是一个更合适的词。
4赞
whoan
4/20/2018
#2
如果你看一下 GNU 手册
页,你会看到循环有这样的语法:
for
The syntax of the for command is:
for name [ [in [words …] ] ; ] do commands; done
因此,正如您所看到的,额外的分号是可选部分的一部分。
linux-die 手册页也作了相同的说明。
评论
2赞
Nahuel Fouilleul
4/20/2018
也许是因为分号是必需的,以指示变量参数列表的末尾,并且可以是有效的参数 (),但是由于 for 的参数中没有分隔符,因此不再需要分隔符;
do
for i in a do c; do echo $i;done
"$@"
2赞
Nahuel Fouilleul
4/20/2018
此外,高尔夫球手使用的未记录的 bash 语法也较短for i;{ echo $i;}
评论
for ((i=0;i<5;++i)) do echo foo; done