为什么bash数组的一部分作为命令执行?

时间:2017-06-12 18:39:45

标签: arrays linux bash raspberry-pi debian-jessie

这些示例已在运行2017-04-10版Raspbian Jessie的Raspberry Pi 3上运行,更新至2017年6月初.Bash版本为4.3.30(1)。

最近在尝试一些代码时,我发现正在执行bash数组的内容。幸运的是,他们没有危险!

这是一个简单的功能:

#!/bin/bash
echo "y.sh starting"
echo "parameter string is <$@>"
args=( $@ )
echo "args array is <${args[@]}>"
echo "args array length is ${#args[@]}"
echo "y.sh ending"

这是输出

pi@brassica:~ $ ./y.sh
y.sh starting
parameter string is <>
args array is <>
args array length is 0
y.sh ending
pi@brassica:~ $ ./y.sh ls
y.sh starting
parameter string is <ls>
args array is <ls>
args array length is 1
y.sh ending

这里没什么意外的。

添加y *参数后,ls命令输出出现在数组中:

pi@brassica:~ $ ./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时,没有额外信息的迹象

pi@brassica:~ $ ./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的“长”输出也是有意义的。

感谢Cheshire Cat的家。

1 个答案:

答案 0 :(得分:6)

您没有执行ls -la y*您将参数传递给y.sh。第一个是ls,然后是-la,然后glob y*扩展到的每个文件都成为它自己的参数。

所以你没有执行命令,但是shell正在扩展glob。

当你运行ls y*时会发生什么。您实际上并未将字符串y*传递给ls。相反,shell会扩展y*并将匹配glob的每个文件作为参数放置到ls,这样您就可以正常运行

ls y01.sh y02.sh y03.sh y04a.sh y04.sh y.sh ytq

键入时

ls y*

您也可以使用其他命令看到相同的效果。例如,echo会打印出给定的每个参数,因此您可以通过执行ls y*来模拟echo y*(尽管echo赢得了显示任何目录的内容与y)