Bashのechoが独立変数の内容を変更するのはなぜですか?

Bashのechoが独立変数の内容を変更するのはなぜですか?

次のコードがあります(最小の例)。

#!/bin/bash                                                                                              
                                                                                                         
echo -ne "# Foo Bar Baz Hello World \r                           "                                       
var=''                                                                                                   
                                                                                                         
function fun {
  # some stuff happening in between                                                                                         
  var='something else'
}

fun

echo $var

驚くべきことに、出力は次のようになります。

$ /tmp/test.sh
                           something else 

上記のエコーが変数の内容を変更できる理由を誰かが説明できますか?

ベストアンサー1

echo上記のスクリプトの内容はいいえ変数を変更しますvar。これは許可されません。ここで何が起こっていますか?

  1. 最初のものがecho呼び出され、1行が印刷され、"# Foo Bar Baz Hello World \r"すぐに次の文字\r(ここでは空白)で上書きされます。
  2. varに設定されています''
  3. 機能がfun作成されました。
  4. fun呼び出され、次のようvarに設定されます。'something else'
  5. 今重要な点があります。echo -n改行文字が印刷されないため、 の出力は長さvarに達するまで上記の末尾文字の後の文字を上書きします。var

この動作により、入力の3つの部分("# Foo Bar Baz Hello World"、および)" "の内容がすべて'something else'重なり合い、全体が混乱します。

このタングルの出力はスクリプトによって「通過」されます(そして不快な副作用を引き起こす可能性があります)。

より明確に説明するには:

#!/bin/bash

echo -ne "# Foo Bar Baz Hello World             \r  ANYTHING"
var=''

function fun {
  var=D
}

fun

echo $var

出力:

$ /tmp/test.sh
  ANYTHINGDaz Hello World    

その結果、私たちは次のことを学びました。

echo -ne "Something \r"echo後にスペースがあり、スクリプト出力が切り捨てられた場合は戻り値と一緒に使用できますが、\r前の文字\r列の長さが次の値より小さい場合にのみ可能ですvar

=>避けてください。

おすすめ記事