算術問題のある単純なシェルスクリプト... **問題が発生する

算術問題のある単純なシェルスクリプト... **問題が発生する

このスクリプトを実行すると、次のエラーが発生します。

./myscript.sh: 16: 算術式: 期待されるデフォルト値: "1 ** 1"

最初の行に示すようにbashを使用してこのシェルスクリプトを実行すると、#! /bin/bash数学が正しく機能します。残念ながら/bin/sh。それが重要であれば、私はLinux Mintを使用しています。

#! /bin/sh

x=1
while [ $x -le 10 ]
do
    y=1
    while [ $y -le 10 ]
    do
        echo $(($y ** $x))"   \c"
        y=`expr $y \+ 1`
    done
    echo
    x=`expr $x \+ 1`
done

答え1

標準シェル操作整数算術演算のみが許可されます。これには**bashの拡張指数は含まれません。

整数指数化はシェル関数として簡単に実装されます(ただし、ラップアラウンドに直面しますが)。

pow () {
    set $1 $2 1
    while [ $2 -gt 0 ]; do
      set $1 $(($2-1)) $(($1*$3))
    done
    echo $3
}

ところでexprここではなぜ使用されるのでしょうか?シェル演算は加算を行うことができます。

答え2

**指数演算子ではないので運が悪いようです。/bin/shの標準bcただし、以下を使用できますecho "$y ^ $x" | bc

答え3

POSIXシェルには指数演算子がないようです。直接リリースできます。

pow() {
    local x y res i
    x=$1
    y=$2
    res=1
    i=1
    while [ $i -le $y ]; do
        res=$(( res * x ))
        i=$(( i + 1 ))
    done
    echo $res
}

x=1
while [ $x -le 10 ]; do
    y=1
    while [ $y -le 10 ]; do
        echo "$(pow $y $x)   \c"
        y=$(( y + 1 ))
    done
    echo
    x=$(( x + 1 ))
done

関連情報