2つの変数でアンダースコアを表示

2つの変数でアンダースコアを表示

次のようにスクリプトに変数を追加しようとしています。

ssh root@$dev 'cat /etc/hosts > /var/tmp/hosts_$dev_$(date +%F)'

しかし、これはうまくいきません。

/var/tmp/hosts\_$dev\_$(date +%F)'
/var/tmp/hosts_${dev}_$(date +%F)'

誰かが私を助けることができますか?私が何をしても、結果はまだ同じです。

hosts_2017-06-20

将来の使用のための回避策:

次のように二重引用符の代わりに一重引用符を使用します。

ssh root@$dev "cat /etc/hosts > /var/tmp/hosts\_$dev\_$(date +%F)"

答え1

許してくださいこの素晴らしい質問を引用してくださいStackexchangeの他のサイトですでに回答されている質問をもう一度説明する必要がないように、回答を選択してください。次の部分ですbash(1)変数参照に関するマンページ:

3.1.2.2一重引用符

文字を一重引用符(')で囲むと、引用符内の各文字のリテラル値が保持されます。前にバックスラッシュがある場合でも、一重引用符の間に一重引用符を使用することはできません。

3.1.2.3二重引用符

文字を二重引用符()で囲むと、(履歴拡張が有効になっている場合)以外の引用符内のすべての文字のリテラル値が保持されます"。これらの文字は二重引用符の中で特別な意味を維持します(参照:$`\!$`シェル拡張)。バックスラッシュは$、後に、、、`または"改行\文字のいずれかが続く場合にのみ特別な意味を維持します。二重引用符内では、これらの文字の1つに続くバックスラッシュが削除されます。特別な意味を持たない先行バックスラッシュ文字は変更されません。二重引用符の前にバックスラッシュを追加すると、二重引用符の中に二重引用符を入れることができます。有効にすると、!二重引用符内に表示される内容がバックスラッシュを使用してエスケープされていない限り、履歴拡張が行われます。前のバックスラッシュは!削除されません。

特殊パラメータは、*@重引用符で囲まれた場合に特別な意味を持ちます(参照)シェルパラメータ拡張)。

答え:これがオブジェクトファイルに$devその変数の内容がある理由です。

関連情報