私for
は参加する方法を知っていますbash
。
POSIXシェルスクリプトで同等のループを実行するには?
同じ目標を達成する方法はいくつかあります。自由に回答を追加し、どのように機能するかを詳しく説明してください。
これらのループの例はbash
次のとおりです。
#!/bin/bash
for (( i=1; i != 10; i++ ))
do
echo "$i"
done
答え1
以下で役に立つ情報を見つけました。Shellcheck.net Wiki、私は次のように引用します。
大きな打撃1:
for ((init; test; next)); do foo; done
POSIX:
: "$((init))" while [ "$((test))" -ne 0 ]; do foo; : "$((next))"; done
ただし、これはPOSIXではないため、またはにi++
翻訳する必要があります。i += 1
i = i + 1
:
常に成功した終了コードを持つ空のコマンドです。"$((expression))"
引数として渡された算術拡張です:
。算術拡張では、変数に割り当てたり、算術/比較を実行したりできます。
したがって、問題の上記のスクリプトは、次の規則を使用してPOSIX方式で再構築できます。
#!/bin/sh
: "$((i=1))"
while [ "$((i != 10))" -ne 0 ]
do
echo "$i"
: "$((i = i + 1))"
done
ここでは、次のように明確にすることができます。
#!/bin/sh
i=1
while [ "$i" -ne 10 ]
do
echo "$i"
i=$((i + 1))
done
図のようにinit
定数値を割り当てるため、算術式を評価する必要はありません。 inは簡単に式に変換でき、forは算術式内で変数代入の代わりにシェル変数代入を使用するため、引用するi != 10
必要はありません。test
[
next
:
i++
-> 他にも、i = i + 1
ksh/bash 特定の構文の POSIX 以外の翻訳が必要な場合もあります。
i=1, j=2
。算術演算子,
は本物POSIX(一部のロケールではksh93の小数点区切り文字と競合します。)たとえば、他の演算子に置き換えることができますが、使用+
する方が明確です。: "$(((i=1) + (j=2)))"
i=1 j=2
a[0]=1
: POSIX シェルには配列がありません。i = 2**20
処置: POSIXシェル構文には指数演算子はありません。<<
ただし、2の累乗がサポートされているため、i = 1 << 20
他の累乗の場合は次のものを使用できますbc
。i=$(echo "3 ^ 20" | bc)
i = RANDOM % 3
: POSIX ではありません。 POSIXツールボックスに最も近いのはi=$(awk 'BEGIN{srand(); print int(rand() * 3)}')
。
1技術的には、この構文はksh93シェルから来ており、bashに加えてzshでも利用できます。
答え2
上記の違いに関する詳細な背景情報を提供していただきありがとうございます。 shellcheck.netを使用するときに私に役立つ選択肢は次のとおりです。
強く打つ
for i in {1..100}; do
...
done
POSIX
i=1; while [ $i -le 100 ]; do
...
i=$(( i + 1 ))
done
一部の人々は、seqもseq 1 10を使用するオプションであると指摘しました。ループを作成しますが、seqを持つOSによって異なります。
答え3
このアプローチでは、$
任意の変数を挿入できるため、より一般的です。
#!/bin/sh
for i in $(seq 1 10); do
echo $i
done
ユーティリティがインストールされていることを確認してください。seq
しかし、。CoreUtils