この質問は複雑に見えるかもしれませんが、そうではありません!考慮する:
% f() { echo "$@"; }
% f a
a
% f cmd -o"value with space"
cmd -ovalue with space
% f cmd -ovalue with space
cmd -ovalue with space
% f cmd -o'value with "quotes"'
cmd -ovalue with "quotes"
% f cmd -ovalue with "quotes"
cmd -ovalue with quotes
明らかに、「間隔値」属性は失われるパラメータにすぎず、同様に再入力すると二重引用符が「食べられます」。
必要な出力は、同じ出力を生成するために入力として再利用できる出力です。
BASHにはこれを可能にする機能が組み込まれていないようです。そうですか?
言う
何をしたいのかわからない場合:コマンドをシェル配列に保存し、ユーザーが出力をコピーしてシェルプロンプト(またはスクリプト)に貼り付けることができるように、これらの配列を標準出力として印刷したいと思います。配列内で同じコマンドを再現するため。
次の(愚かな)例を考えてみましょう。
> X=(echo "Bob's car is named \"Bobby\"")
正常なものがecho "${X[@]}"
出力されます
echo Bobの車名は「Bobby」です。
しかし、一つ可能な正しい出力は次のとおりです。
echo Bobの車名は「Bobby」です。
ベストアンサー1
その期間中の変身オプションの一つBashのパラメータ拡張はい(Bash 4.4以降は利用可能に見え、以前のバージョンでは「無効な置換」出力):
${parameter@operator}
拡張は価値の変化です。範囲または関連情報範囲それ自体は演算子の値に依存します。各オペレーター手紙です:[...]
Q
拡張子は、値が次のような文字列です。範囲入力として再利用できる形式で引用してください。
bash-5.2$ f() { echo "${@@Q}"; }
bash-5.2$ f cmd -o'value with "quotes"'
'cmd' '-ovalue with "quotes"'
bash-5.2$ f cmd -ovalue with "quotes"
'cmd' '-ovalue' 'with' 'quotes'