
次のコマンドを試しました
variable='one|name'
echo $variable
出力は
one|name
一方、echo one|name
エラーが発生します。これは、bash がパイプとして扱い、入力としてコマンドを実行しようとするためNo command 'name' found
、妥当です。|
name
one
しかし、なぜecho $variable
printが なのでしょうかone|name
? パラメータと変数の展開後、これは と同等ではないでしょうかecho one|name
?
バージョン:
GNU bash, version 4.3.11(1)-release (i686-pc-linux-gnu)
答え1
いいえ、そうではありません。bash
コマンドを操作する。
と入力するとecho one|name
、bash
コマンドが解析され、|
パイプ トークンとして扱われ、|
パイプラインが実行されます。
と入力すると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
結果は期待どおりになります。ただし、これはスクリプトでのみ実行できます (役立つコメントをありがとうございます)。