環境はUbuntu14.04LTS。
問題
シェルスクリプトで次のようなfor文を記述した。
#!/bin/sh for i in {1..10} do echo " $i 回目のループです." done
その結果が以下である。
{1..10} 回目のループです.
どうやら、変数iの中にリスト{1..10}がまんま代入されたらしい。意味分からん。
なぜ?
他サイトのシェルスクリプトの記述例を見ても、何がおかしいのかわからない。基本的なfor文を回せないことにショックを受けつつググりまくっていると、以下のサイトを見つけた。sechiro.hatenablog.com
bashとshは違うらしい。曰く、
sh という名前で bash を起動すると、 bash は古くからある sh の起動動作をできるだけ真似しようとします。
らしい。bashもshも同じだと思ってました。というかshはbashの省略系かと思ってました。
そんなこんなで調べていると、以下のようなサイトも。
Ubuntuの/bin/shはbashではなくdashsiguniang.wordpress.com
dashなんてものもあるらしい。まったく知らなかった。
解決策
結局、どうすればいいのか?次のように記述して解決した。
#!/bin/bash for i in {1..10} do echo " $i 回目のループです." done
その結果が以下である。
1 回目のループです. 2 回目のループです. 3 回目のループです. 4 回目のループです. 5 回目のループです. 6 回目のループです. 7 回目のループです. 8 回目のループです. 9 回目のループです. 10 回目のループです.
なにを変えたかおかわりだろうか。
最初の
#!/bin/sh
を
#!/bin/bash
に変えたのだ。分かり辛いよシェルスクリプト。半角スペース付けただけでエラー起こしたりするところもな。
badworld.sh
#!/bin/bash str = "Hello World!" echo $str
実行結果
./badworld.sh: 行 2: str: コマンドが見つかりません
goodworld.sh
#!/bin/bash str="Hello World!" echo $str
実行結果
Hello World!
間違い探しかよ。