web-dev-qa-db-ja.com

zshとbashのループ

zshでループを作成する方法が2つあることに気づきました。

  1. for x (1 2 3); do echo $x; done
  2. for x in 1 2 3; do echo $x; done

彼らは両方とも印刷します:

1
2
3

私の質問は、なぜ2つの構文ですか? $xそれぞれに異なるオブジェクトのタイプを繰り返しますか?

bashは同様の区別をしますか?

補遺:

以下はなぜ機能するのですか?:

#!/bin/zsh
a=1
b=2
c=5    

d=(a b c)    
for x in $d; do print $x;done

しかし、これはしませんか?:

#!/bin/zsh
a=1
b=2
c=5

d=(a b c)    
# It complains with "parse error near `$d'"
for x $d; do print $x;done 
65

ループなどの複雑なコマンドのいくつかの形式には、zshで 代替形式 があります。これらの形式は主に Cシェル に触発されています。これはzshが若いときにかなり一般的でしたが、現在は姿を消しています。これらの代替フォームは、通常のフォームとまったく同じように機能し、構文が異なります。それらは少し短くなりますが、はっきりしません。

forコマンドの標準形式は_for x in 1 2 3; do echo $x; done_であり、whileコマンドの標準形式は_while test …; do somecommand; done_です。 Ksh、bash、およびzshには、forの代替形式があります。for ((i = 0; i < 42; i++)); do somecommand; doneは、PascalやCなどの言語のforループを模倣して、整数を列挙します。 zshに存在する他のエキゾチックな形式はzshに固有です(ただし、cshに触発されていることがよくあります)。