【问题标题】:Why is part of a bash array is executed as a command?为什么 bash 数组的一部分作为命令执行?
【发布时间】:2017-11-14 08:21:25
【问题描述】:

这些示例在运行 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 没有产生“长”输出也很有趣。

感谢柴郡猫的家。

【问题讨论】:

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


    【解决方案1】:

    您没有执行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 将打印给定的每个参数,因此您可以通过执行 echo y* 来模拟 ls y*(尽管 echo 不会显示任何以 y 开头的目录的内容)

    【讨论】:

    猜你喜欢
    • 2018-08-04
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 2013-08-27
    相关资源
    最近更新 更多