鉴于以下部分bash脚本,第一行如何解释?
这是bash命令l=(*)
for v in ${l[@]}
do
echo $v
done
的快捷方式吗?
arc
cgi-bin
dist
输出:
{{1}}
有趣的是,如果我在bash shell中键入“ *”,则会收到错误消息“ bash:arc:command not found”,想必这是某种原因吗?
答案 0 :(得分:7)
否;括号仅在此上下文中声明一个数组。外壳是扩展*
全局的东西。
更多细节
variable=(value1 value2)
声明一个包含两个元素的数组;全局*
会扩展为当前目录中所有(非隐藏)文件的名称。如果您有名为arc
,cgi-bin
和dist
的文件或目录,然后键入
*
您正在尝试运行命令
arc cgi-bin dist
如果您在arc
的任何地方都没有名为PATH
的保护罩,那当然会失败。
顺便说一句,${l[@]}
是不正确的;您绝对希望"${l[@]}"
用双引号引起来-否则您将失去数组中所有带引号的字符串的完整性(就像$@
基本上总是一个错误,并且必须为"$@"
)。只需打印数组,就不需要循环;
printf '%s\n' "${l[@]}"
答案 1 :(得分:1)
尝试输入echo *
,这将使事情变得更清楚。
顺便说一句,你也可以写:
for v in *
do
echo "$v"
done