0

$recipient値とそれに続く改行を含む必要があるというシェル変数を設定しようとしています。

$ set -x # force bash to show commands as it executes them

これは、改行$userを続けたい値です。

$ user=user@xxx.com
+ user=user@xxx.com

echo $user次に、二重引用符で囲まれたコマンド置換内で呼び出します。echoステートメントは の後に改行を作成し、$user二重引用符は改行を保持する必要があります。

$ recipient="$(echo $user)"
++ echo user@xxx.com
+ recipient=user@xxx.com

ただし、印刷$recipientすると、改行が破棄されていることがわかります。

$ echo "'recipient'"
+ echo ''\''recipient'\'''
'recipient'

私は、bash バージョン 4.1.5 および 3.1.17 で同じ動作を発見し、dash でも問題を再現しました。

echo ではなく「printf」を使用してみました。これは何も変わりませんでした。

これは予想される動作ですか?

4

2 に答える 2

4

コマンド置換により、末尾の改行が削除されます。標準から:

シェルは、サブシェル環境でコマンドを実行し (「シェル実行環境」を参照)、コマンド置換 (コマンドのテキストとそれを囲む "$()" または逆引用符) をコマンドの標準出力に置き換えることにより、コマンド置換を拡張し、削除します。置換の最後にある 1 つ以上の文字のシーケンス。出力の終わりの前に埋め込まれた文字は削除されません。ただし、IFS の値と有効な引用符によっては、フィールド区切り文字として扱われ、フィールド分割中に削除される場合があります。出力に null バイトが含まれている場合、動作は規定されていません。

明示的に改行を追加する必要があります。多分:

recipient="$user
"

ここでコマンド置換を使用する理由はまったくありません。(つまり、$(echo ...)ほとんどの場合、これは愚かなことです。)

于 2013-01-09T19:26:10.543 に答える
1

すべてのシェル バージョンは同じように反応します。これはスクリプト作成において新しいことではありません。

元の割り当ての末尾にある改行は、変数の値には含まれません。現在のコマンドを「終了」し、シェルに処理するように通知するだけです。

おそらく user="user@xxx.com\n" は機能しますが、なぜこれが必要なのかについての文脈がなくても、人々は通常、変数値を改行のような書式設定「ツール」とは別に保持していることを知っておいてください.

IHTH。

于 2013-01-09T19:28:24.123 に答える