2

这些示例已在运行 2017 年 6 月上旬更新的 2017-04-10 版 Raspbian Jessie 的 Raspberry Pi 3 上运行。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 的“长”输出也很有趣。

感谢柴郡猫的家。

4

1 回答 1

6

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

因此,您没有执行命令,而是 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 开头的目录的内容)

于 2017-06-12T18:48:25.187 回答