bash のドキュメント(man bash
)をみると for
の使い方は以下の 2 つがあり、どちらも同じ for
というキーワードを使いますが別の機能です。この記事では「foreach スタイル」と「C 言語スタイル」と呼ぶことにします。
foreach スタイル
for name [ [ in [ word ... ] ] ; ] do list ; done
C 言語スタイル
for (( expr1 ; expr2 ; expr3 )) ; do list ; done
foreach スタイルは Bourne シェルの最初、つまり 1979 年の Unix Version 7 に搭載されたバージョンの頃あります(余談ですが最初の Bourne シェルでは shift
は 1 つしかずらすことができなかったようです)。
POSIX シェルの範囲ではシェルスクリプトには「配列」はありませんが、それに近いものとして「位置パラメータ」があります。for
はその位置パラメータ(や単語リスト)を処理するものとして作られたものです。また bash、mksh、ksh、yash、zsh という配列があるシェルでは for
で配列を扱うこともできます。ちなみに (t)csh では同じことをするコマンド名はそのまま foreach
です。(foreach name (wordlist)
... end
)
一方 C 言語スタイルは ksh88 で導入されました。名前からも分かる通り 1988 年頃の話です。Bourne シェルの開発者はスティーブン・ボーンですが、ksh の開発者はデビッド・コーンで開発者が異なります。ksh では C 言語由来の機能が多く取り入れられました。その一つが C 言語スタイルの for
です。
POSIX シェルは ksh88 をベースとしていますが、残念ながら C 言語スタイルの for
は POSIX には取り入れられませんでした(while
で十分だからでしょうか?)。C 言語スタイルの for
が使えるのは bash、ksh、zsh のみです。
多くの言語では C 言語スタイルが最初に実装され、後から foreach スタイルが導入されたのとは反対に、シェルスクリプトでは先に foreach スタイルが実装され、(POSIX では採用されなかったとは言え) 後から C 言語スタイルができたというのは興味深い話だと思います。
とりとめのない話になりましたが、シェルスクリプトにおける for
コマンドの雑学でした。