ベスパリブ

プログラミングを主とした日記・備忘録です。ベスパ持ってないです。

シェルスクリプトでfor文が回せなかった話

環境は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!

間違い探しかよ。