一つの本当に簡単な方法は、使用しています配列または位置パラメータ
アレイベースのソリューション:
# Build command
declare -a CMD_AND_ARGS=(command and args with normal quoting)
# Append arguments
CMD_AND_ARGS+=(more arguments quoted the normal way)
# Execute command
"${CMD_AND_ARGS[@]}"
位置パラメータベースのソリューション:
# Create command
set -- command and args with normal quoting
# Append arguments
set -- "[email protected]" more arguments quoted the normal way
# Execute command
"[email protected]"
両方のソリューションのいいところは、位置パラメータを展開するので、あなたは、引用符内の引用符を配置する必要はありませんですまたは二重引用符で囲まれた配列は、単語分割と展開を再度実行しません。
例:両方のケースでは、あなたのスクリプトの流れに応じて、異なる引数を追加する(例:IF /ケース)を選択するインスタンス持つ条件式のため、インクリメンタルあなたのコマンドを構築するために取得すること
declare -a CMD=()
CMD=(ls "/dir/with spaces/in its name")
"$CMD"
set -- ls "/dir/with spaces/in its name"
"[email protected]"
注意。
コマンドを別のパイプにパイプしたい場合は、|
のシンボルを引用符で囲まれていない配列宣言内で使用することはできないため、各コマンドを別々に構築する必要があります(たとえば2つの配列)配管が行われることはありません。
(バッククォートを使用して)コマンドの出力をキャプチャしてから、エコーすることは反パターンです。コマンドを直接実行して、出力を通常の場所に移動させてください。ところで、もっと直接的に実行するのではなく、変数にコマンドを格納する実際の理由は何ですか? –