ループを作成するには2つの異なる方法があることがわかりました。扱いにくい:
for x (1 2 3); do echo $x; done
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が若い頃にかなり一般的でしたが、今は消えています。これらの代替形式は、構文を除いて通常の形式とまったく同じように機能します。少し短いですが、あまり明確ではありません。
コマンドの標準形式for
はfor 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; done
for
答え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*)
かっこは(少なくとも初心者の私にとっては)重複して見え、これが標準がかっこなしで定義される理由だと思います。
私はこのスクリプトを書く方法を学んでいますが、タイトルに基づいてこの質問を見つけました。これは許容される回答の実際のケースであると考えることができます。