执行存储为数组的命令(参数可能包含空格)

执行存储为数组的命令(参数可能包含空格)

在尝试改编这个例子时这个答案

mycmd=(ls)               # initial command
if [ "$want_detail" = 1 ]; then
    mycmd+=(-l)          # optional flag
fi
mycmd+=("$targetdir")    # the filename

"${mycmd[@]}"

我想出了

mycmd=(python3 /tmp/test.py)
A="a value"
B="b value"
ARGS="-a ${A} -b ${B}"
mycmd+=("$ARGS")
"${mycmd[@]}"

我没有单独添加每个标志(就像mycmd+=(-l)在原始示例中一样)的原因是因为我有 9 个标志,所以我试图避免在单独的行上添加每个标志及其值(额外 18 行)。

问题在于test.py将参​​数作为单个字符串接收。我还怀疑我还会遇到其他问题,因为我的参数的值可能包含空格(这可能可以用 来解决ARGS="-a \"${A}\" -b \"${B}\""?)。

$ bash -x /tmp/test.sh
+ mycmd=(python3 /tmp/test.py)                          
+ A='a value'                                           
+ B='b value'                                           
+ ARGS='-a a value -b b value'                          
+ mycmd+=("$ARGS")                                      
+ python3 /tmp/test.py '-a a value -b b value'          
usage: test.py [-h] -a A -b B                           
test.py: error: the following arguments are required: -b

答案1

我不会单独添加每个标志......

那就是问题所在。通过将单独的参数压缩为一个,您有点破坏了在这里使用数组的全部意义。

我试图避免在单独的行上添加每个标志及其值......

然后做类似的事情:

mycmd+=(-a "$A") 
# or
mycmd+=(-a "$A" -b "$B")

相关内容