При попытке адаптировать этот пример из этого ответа

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
0
DeepSpace 17 Авг 2020 в 12:31
В вашем примере с ls это должно быть mycmd+=(-- "$targetdir"), а не mycmd+=("$targetdir"), особенно если вы не можете гарантировать, что $targetdir не начнется с -.
 – 
Stéphane Chazelas
17 Авг 2020 в 12:50

1 ответ

Лучший ответ

Я не добавляю каждый флаг отдельно...

Это проблема. Вы вроде как победили весь смысл использования массивов здесь, объединив отдельные аргументы в один.

Я пытаюсь не добавлять каждый флаг и его значение в отдельную строку...

Затем сделайте что-нибудь вроде:

mycmd+=(-a "$A") 
# or
mycmd+=(-a "$A" -b "$B")
3
muru 17 Авг 2020 в 12:42