这个例子已经运行在2017年6月初的Raspbian Jessie 2017-04-10版的Raspberry Pi 3上.Bash的版本是4.3.30(1)。为什么bash数组的一部分作为命令执行?
在最近尝试使用一些代码时,我发现正在执行bash数组的内容。幸运的是,它们并不危险!
这里有一个简单的函数:
#!/bin/bash
echo "y.sh starting"
echo "parameter string is <[email protected]>"
args=([email protected])
echo "args array is <${args[@]}>"
echo "args array length is ${#args[@]}"
echo "y.sh ending"
,这里是输出
[email protected]:~ $ ./y.sh
y.sh starting
parameter string is <>
args array is <>
args array length is 0
y.sh ending
[email protected]:~ $ ./y.sh ls
y.sh starting
parameter string is <ls>
args array is <ls>
args array length is 1
y.sh ending
无意外上方这里。
添加Y *参数之后,ls命令输出出现在阵列中:
[email protected]:~ $ ./y.sh ls y*
y.sh starting
parameter string is <ls y01.sh y02.sh y03.sh y04a.sh y04.sh y.sh ytq>
args array is <ls y01.sh y02.sh y03.sh y04a.sh y04.sh y.sh ytq>
args array length is 8
y.sh ending
但被添加时-La,没有的额外信息
[email protected]:~ $ ./y.sh ls -la y*
y.sh starting
parameter string is <ls -la y01.sh y02.sh y03.sh y04a.sh y04.sh y.sh ytq>
args array is <ls -la y01.sh y02.sh y03.sh y04a.sh y04.sh y.sh ytq>
args array length is 9
y.sh ending
符号如果有人能够解释为什么命令正在执行以及可以进行哪些更改以使其不会执行,这将非常有帮助。为什么ls的“长”输出没有产生,这也是一个解释。
感谢柴郡猫的家乡。
谢谢。我尝试使用@ runlevel0在这里设置的方法https://stackoverflow.com/questions/12711786/bash-convert-command-line-arguments-into-array,并意识到问题发生之前,功能开始工作参数列表。这指向我http://www.tldp.org/LDP/abs/html/globbingref.html,它扩展了你的解释。情况经常如此,根本原因并不是人们所期望的! – user8150417
由于问题出现在函数外部,所以它不能被函数内部的任何东西修复。 @TaxpayerZombies对这个问题的回应https://ksearch.wordpress。com/2010/09/23/wildcard-expansion-bash-shell /指向正确的方向 - 设置简要禁用通配符的别名。 'alias y ='set -o noglob; yy'; yy(){〜/ y.sh“$ @”; set + o noglob;}' – user8150417