次のコードがあります(最小の例)。
#!/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
。これは許可されません。ここで何が起こっていますか?
- 最初のものが
echo
呼び出され、1行が印刷され、"# Foo Bar Baz Hello World \r"
すぐに次の文字\r
(ここでは空白)で上書きされます。 var
に設定されています''
。- 機能が
fun
作成されました。 fun
呼び出され、次のようvar
に設定されます。'something else'
- 今重要な点があります。
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
。
=>避けてください。