Lab*_*o29 6 command-line bash scripts
我制作了一个脚本,我写道:
COMMAND="/usr/bin/exiftool $PATH_NAME" .... 代码 .... $命令
变量 $PATH_NAME 在 while 循环内动态分配。该命令可以正常工作,直到遇到带有空格的文件(例如 PATH_NAME="Add Driver.png")。控制台输出是:
未找到文件:./Add 未找到文件:driver.png
命令应该是:
/usr/bin/exiftool ./Add driver.png
我认为问题是由 $PATH_NAME 中的空格引起的。我也尝试直接执行命令:
评估“/usr/bin/exiftool $PATH_NAME”
但同样的输出错误。有解决问题的想法吗?谢谢。
不要使用简单的字符串,而是使用数组构建您的命令。数组提供了一个方便的接口:如果a是一个数组,那么"${a[@]}"(注意引号)扩展到 的每个元素a,没有额外的字段拆分或通配符(所以空格和通配符之类的东西应该保持不变)。
例子:
$ a=(printf "|%s|\n" "foo bar" "*")
$ echo ${a[@]}
printf |%s|\n foo bar bin boot dev etc home lib lib64 lost+found mnt opt proc root run sbin srv sys tmp usr var
Run Code Online (Sandbox Code Playgroud)
注意如何*扩大,以及如何之间多余的空格foo和bar丢失。但是使用"${a[@]}",这些被保留:
$ echo "${a[@]}"
printf |%s|\n foo bar *
Run Code Online (Sandbox Code Playgroud)
这是构建命令的理想选择。现在,你可以这样做:
$ "${a[@]}"
|foo bar|
|*|
Run Code Online (Sandbox Code Playgroud)
看?这些论点被完美地保留了下来。
所以,做:
COMMAND=(/usr/bin/exiftool "$PATH_NAME")
"${COMMAND[@]}"
Run Code Online (Sandbox Code Playgroud)