私は次のコマンドを試しました
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
変数を拡張する前にトークンの解析が行われるため、コマンドは次の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
結果は予想通りである。ただし、これはスクリプトでのみ実行できます(有用な説明に感謝します)。