$ '$ foo'と$“ $ foo”の違い


9

変数のコンテキスト内で一重引用符と二重引用符の間のニュアンスを理解するのが難しい

私は定義します:

foo=pwd

次にこれらを実行します:

echo $'$foo'

どのエコー$foo$私のechoコマンドの最初が削除されることを意味します)

echo $"$foo"

これはエコーしますpwd(つまり、bashは$foo、私の変数をその値に展開します)

echo $`$foo`

最後に、このエコー$~/scripts(私は印刷することを期待~/scriptsしていません$~/scripts

誰かがこれらの違いを理解するのを手伝ってくれる?

回答:


11

最終的には、リテラルとそれに続くコマンド置換の組み合わせである$~/scriptsため、最後の1つが出力されます。したがって、先頭はリテラルとして、末尾はコマンド置換として解釈されます。$`foo`$$$`$foo`


私はコードタグを削除し、単に `` `` `` ``文字などに置き換えます。コードタグを希望する場合は、自由にロールバックしてください
Tim

@Timありがとう、正確にはわかりませんが、何らかの理由で編集後の投稿が最初のリビジョンと同じように中断されているように見えたので、ロールバックしました...そして、リビジョンで問題ないように見えます。何が起こったのかわからないので、もう一度投稿を中断する可能性があるので、バージョンにロールバックする前にフォーマットサンドボックスでこれをテストします。とにかく、努力に感謝します。
コス

確かに、問題はありません。鉱山はゼロ幅のスペースを使用するので、編集するときは注意してください。
ティム

2

最初のケース:

echo $'$foo'

どのエコー$foo$私のechoコマンドの最初が削除されることを意味します)

最初$はコマンドとして実行されます。Echoは引数の間にスペースを必要とせず、引数を取ります。

したがって、echo $'$foo'は展開してコマンド$(コマンドではないので無視します)を実行し、次にechoを実行し'$foo'ます。何か''は額面通りに受け取られます-それはそれを拡張するものではありません。必要なものを ''に入れても何も起こりません。

をに置き換える$$$、プロセスIDがエコーされます。


第二:

echo $"$foo"

これはエコーしますpwd(つまり、bashは$foo、私の変数をその値に展開します)

それ""はそれが拡大するのを妨げないからです。""通常、比較する値があることを確認するために使用されます。

空の可能性がある変数がある場合(grep結果からのものなど)、別の値/変数と比較したい場合は、最初の変数をに配置する必要があります""。これにより、エラーを発生させるコードの空のセクション(bashが参照)だけでなく、常に比較する比較が存在することが保証されます。


最後に、3番です。これは興味深いものです。

echo $`$foo`

このエコー$~/scripts(私は印刷することを期待~/scriptsしていません$~/scripts

これは(この場合)エコーが$文字を最初に出力するためです。何かをバッククォートに入れると、変数の値がコマンドとして実行されます(より新しいバージョンのbashでそれを行うためのより良い方法は$(command)

したがって、最初にエコーし$、次に展開​`$foo`​​`pwd`​て実行し、戻ります~/Scripts。しかし、$以前に印刷物があったので、全体の出力はそうです$~/Scripts


いくつかの非常に難しいフォーマットでの作業は素晴らしいです!
アロニカル

1
@Arronical Thanks :)あなたはそれを見ることができませんが、最後の文のためにいくつかのゼロ幅のスペースがあります。架空のインターネットポイントのために行うこと...!
ティム

1
+1良い答え。考えられるnull値を処理するだけでなく、特別な理由がない限り、クォート変数がデフォルトであることを追加します。これについて知りたかった以上のことについては、unix.stackexchange.com / questions / 171346 /…を参照してください。;)
Joe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.