配列として保存されたコマンドの実行(引数にはスペースを含めることができます)

配列として保存されたコマンドの実行(引数にはスペースを含めることができます)

この例を適用しようとするとこの回答

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

各フラグを個別に追加することはありません...

それが問題だ。別々のパラメータを1つに圧縮すると、ここで配列の使用の全体的なポイントを無効にできます。

各フラグとその値を別々の行に追加したくありません...

次に、次のようにします。

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

関連情報