5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

シェルスクリプトのforはPOSIXで規定されてるのはforeachスタイルのループだけである

Posted at

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 コマンドの雑学でした。

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?