在尝试改编这个例子时这个答案
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")