带有算术问题的简单 Shell 脚本... ** 给我带来了麻烦

带有算术问题的简单 Shell 脚本... ** 给我带来了麻烦

当我运行此脚本时,我收到此错误:

./myscript.sh: 16: 算术表达式: 期望主值: "1 ** 1"

当我使用 bash 运行这个 shell 脚本时,如#! /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

标准 shell 算术只允许整数算术运算。这不包括**bash 的扩展的求幂运算。

整数求幂很容易实现为 shell 函数(尽管您很快就会遇到环绕)。

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

顺便说一句,为什么用expr在这里? shell算术可以做加法。

答案2

我认为你运气不好,因为**指数运算符不是/bin/sh 的标准bc不过,您可以使用: echo "$y ^ $x" | bc

答案3

POSIX shell 显然没有幂运算符。您可以自己推出:

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

相关内容