Bashの変数拡張

Bashの変数拡張

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

variable='one|name'
echo $variable

出力は次のとおりです

one|name

代わりにecho one|nameエラーが発生しますNo command 'name' found。 Bashはそれを|パイプとして扱い、コマンドを入力nameとしてone実行しようとするので、これは意味があります。

echo $variableしかし、なぜ印刷されますか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変数を拡張する前にトークンの解析が行われるため、コマンドは次のbash2つの部分に解析されますecho。その後、$variable拡張される変数拡張を実行します。この場合は文字列の一部であり、パイプトークンと見なすことはできません(もちろん、)。$variableone|nameone|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

結果は予想通りである。ただし、これはスクリプトでのみ実行できます(有用な説明に感謝します)。

関連情報