bashで一行で複数変数の代入を行った場合の処理順に関して、後ろの代入処理で、それより前に代入した変数の値が使えるのかな?というとても些細な事の確認をしたメモ。
確認作業
結論としては、前の代入から順番に行われるので、後ろの代入で前の変数の値が使えることが分かった。
以下、確認作業。
$ #既存の変数値の紛れがないよう、リセットしておく
$ a= b=
$ #これでbにaの内容が入るか?
$ a=hoge b=$a
$ #入った!
$ echo $a $b
hoge hoge
↓つまり変数のスワップとかはこういう風に書ける。
$ a=foo b=bar
$ t=$a $a=$b $b=$t
$ echo $a $b
bar foo
↓ちなみに配列変数の一発代入リテラルでこんな感じの変態記述は出来ないようだw
$ a=() b= #リセット
$ a=(foo [1]=${a[0]} baz) b=${a[0]}
$ #ふたつ目の値が a[0] と同じ foo になるかな?と思ったけどこれは無理のようだ
$ for i in "${!a[@]}"; do echo "a[$i] is '${a[$i]}'"; done
a[0] is 'foo'
a[1] is ''
a[2] is 'baz'
$ #なお単に前で代入した配列変数の値を使ってるだけなので、bには期待通りのa[0]の値が入っている
$ echo $b
foo
使いみち?
IFSを一時的に保存して後で戻したいときに、バックアップ用変数とIFSの更新が一発でできるとちょっと嬉しいなって思ったので。確認したくなった次第。
つまりこんな事をしたかったんだが、問題なく出来ることが分かった。
func() {
local IFS0=$IFS IFS=$'\n'
# do something with custom IFS
IFS=$IFS0
# do other
}
細かすぎて普通の人にはどうでもよいことだと思う(^^;