zshとbashのForループ

zshとbashのForループ

ループを作成するには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他のものに対する繰り返しオブジェクトタイプそれらのそれぞれから?

する強く打つ同様の区別をしますか?

付録:

次はなぜ動作しますか? :

#!/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 

答え1

さまざまな形式の複雑なコマンド(ループなど)に代替形態zshから。これらの形態のほとんどは以下からインスピレーションを得ました。Cシェル、これはzshが若い頃にかなり一般的でしたが、今は消えています。これらの代替形式は、構文を除いて通常の形式とまったく同じように機能します。少し短いですが、あまり明確ではありません。

コマンドの標準形式forfor x in 1 2 3; do echo $x; done、コマンドの標準形式whileはですwhile test …; do somecommand; done。 Ksh、bash、およびzshには、PascalやCなどの言語でループをエミュレートして整数を列挙する別の形式がforあります。 zshに存在する他のエキゾチックな形はzsh専用です(ただしcshからインスピレーションを受けたことが多いです)。for ((i = 0; i < 42; i++)); do somecommand; donefor

答え2

私のユースケースには、パッチを必要とするフォントファイル(つまり、多くの.ttfファイル)がたくさんあり、スクリプトファイルに保存せずに端末から直接スクリプトコマンドを入力して実行したいと思います。

for x in JetBrainsMonoNL* ; do \
    fontforge -script fontpatcher $x --mono -l -q --fontawesome \
        --octicons --fontlogos --mdi --powerline --powerlineextra; \
done;

ポイントは次のとおりです。JetBrainsMonoNL*最初の形式で作成された場合は、繰り返す配列になります。

for x in (JetBrainsMonoNL*)

かっこは(少なくとも初心者の私にとっては)重複して見え、これが標準がかっこなしで定義される理由だと思います。


私はこのスクリプトを書く方法を学んでいますが、タイトルに基づいてこの質問を見つけました。これは許容される回答の実際のケースであると考えることができます。

関連情報