Bash での変数の展開

Bash での変数の展開

次のコマンドを試しました

variable='one|name'
echo $variable

出力は

one|name

一方、echo one|nameエラーが発生します。これは、bash がパイプとして扱い、入力としてコマンドを実行しようとするためNo command 'name' found、妥当です。|nameone

しかし、なぜecho $variableprintが なのでしょうかone|name? パラメータと変数の展開後、これは と同等ではないでしょうかecho one|name?

バージョン:

GNU bash, version 4.3.11(1)-release (i686-pc-linux-gnu)

答え1

いいえ、そうではありません。bash コマンドを操作する

と入力するとecho one|namebashコマンドが解析され、|パイプ トークンとして扱われ、|パイプラインが実行されます。

と入力するとecho $variable、変数展開の前にトークン解析が行われるため、bashコマンドは と の 2 つの部分に解析されますecho$variableその後、変数展開が行われ、$variableに展開されますone|name。この場合、one|nameは文字列であり、 は|文字列の一部であり、パイプトークンとして扱うことはできません (もちろん、トークン認識フレーズIFS行われました)。変数に が含まれている場合にのみ特別になります。 は|、フィールド分割を実行するための区切り文字としてbash使用されます。|

$ variable='one|name'
$ IFS='|'
$ echo $variable
one name

答え2

Bashその理由は変数を拡張する方法のためです。

変数を に展開する代わりに、one|name変数を に展開します"one|name"。したがって、ここでは値が引用符で囲まれているため、コマンドではなく文字列として扱われます。

strace以下は、コマンドがどのように展開されるかを示すコマンドの出力です。

$ variable='one|name'
$ strace echo $variable 
execve("/bin/echo", ["echo", "one|name"], [/* 33 vars */]) = 0
brk(0)                                  = 0x9cc7000

答え3

引用符は作成した文字列の一部です。

もしそうなら

variable=one|name
echo $variable

結果は期待どおりになります。ただし、これはスクリプトでのみ実行できます (役立つコメントをありがとうございます)。

関連情報