use*_*417 2 linux arrays 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"
Run Code Online (Sandbox Code Playgroud)
这是输出
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
Run Code Online (Sandbox Code Playgroud)
这里没什么意外的.
添加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
Run Code Online (Sandbox Code Playgroud)
但是当添加-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
Run Code Online (Sandbox Code Playgroud)
如果某人能够解释执行命令的原因以及可以进行哪些更改以使其不被执行,那将非常有用.解释为什么不产生ls的"长"输出也是有意义的.
感谢Cheshire Cat的家.
你没有执行ls -la y*你传递参数y.sh.第一个是ls,然后-laglob 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
Run Code Online (Sandbox Code Playgroud)
当你输入
ls y*
Run Code Online (Sandbox Code Playgroud)
您也可以使用其他命令看到相同的效果. echo例如,将打印它给出的每个参数,因此您可以ls y*通过执行 模拟echo y*(尽管echo不会显示以y开头的任何目录的内容)