このスクリプトを実行すると、次のエラーが発生します。
./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