POSIXシェルスクリプトで算術ループを作成するには?

POSIXシェルスクリプトで算術ループを作成するには?

forは参加する方法を知っていますbash

POSIXシェルスクリプトで同等のループを実行するには?

同じ目標を達成する方法はいくつかあります。自由に回答を追加し、どのように機能するかを詳しく説明してください。

これらのループの例はbash次のとおりです。

#!/bin/bash
for (( i=1; i != 10; i++ ))
do
    echo "$i"
done

ベストアンサー1

以下で役に立つ情報を見つけました。Shellcheck.net Wiki、私は次のように引用します。

  1. 大きな打撃1:

     for ((init; test; next)); do foo; done
    
  2. POSIX:

     : "$((init))"
     while [ "$((test))" -ne 0 ]; do foo; : "$((next))"; done
    

ただし、これはPOSIXではないため、またはにi++翻訳する必要があります。i += 1i = 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 + 1ksh/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他の累乗の場合は次のものを使用できますbci=$(echo "3 ^ 20" | bc)

  • i = RANDOM % 3: POSIX ではありません。 POSIXツールボックスに最も近いのはi=$(awk 'BEGIN{srand(); print int(rand() * 3)}')


1技術的には、この構文はksh93シェルから来ており、bashに加えてzshでも利用できます。

おすすめ記事