言う

言う

この質問は複雑に見えるかもしれませんが、そうではありません!考慮する:

% 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'

おすすめ記事