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

标签 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命令output出现在数组中:

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 的“长”输出的解释也很有趣。

来自柴郡猫之家的感谢。

最佳答案

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

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

当您也运行 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) 开头的任何目录的内容

关于arrays - 为什么 bash 数组的一部分作为命令执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44506525/

相关文章:

android - 有什么方法可以让 Android 应用程序在 Linux 上运行?

java - 摆脱数组中的 null。 java

php - 比较一个字符串和一个 php 数组,只显示匹配项

arrays - VB.NET 如何声明已知长度的新空数组

ruby - 数组类型错误 : can't convert Fixnum into String

c - 为什么我必须先声明一个不相关的 struct file_handle 变量才能使用该类型?

c - 使用线程计算文件中单词出现次数的程序中的段错误

bash - 使用 Jenkins 进行跨平台脚本编写

linux - 如何计算整个文件中某个字符串出现的次数?

bash - HandBrakeCLI 命令中断 while 循环?