执行存储在 $variable 中的命令

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”

但同样的输出错误。有解决问题的想法吗?谢谢。

mur*_*uru 7

不要使用简单的字符串,而是使用数组构建您的命令。数组提供了一个方便的接口:如果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)

注意如何*扩大,以及如何之间多余的空格foobar丢失。但是使用"${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)