「整数表現が必要です」というメッセージが表示されるのはなぜですか?

「整数表現が必要です」というメッセージが表示されるのはなぜですか?

後で呼び出される小さな関数を作成しようとしています。

簡単にするために、12が2、3、4に分かれていることを確認したいと思います。

コードは次のとおりです

divisible_by () {
  under_test=12
  from=2
  to=4
  divisible=0
  for ((check=from; check<=to; check++)) {
    echo "check= $check"
    if [ $under_test % $check -ne 0 ]; then
      divisible=1
    fi  
  }
  return $divisible
}

x=divisible_by
if [ $x -eq 0 ]; then
  echo "true"
else
  echo "false"
fi

現在私は得る

./5_divisible_by_1_to_10.sh: line 16: [: 
divisible_by: integer expression expected
false

また、数値をパラメータとして渡すのは難しいことがわかりましたが、おそらく関連性があります。

答え1

divisible_by () {
  under_test=12
  from=2
  to=4
  for ((check=from; check<=to; check++)) {
    echo "check=$check"
    ((under_test % check == 0)) || return
  }
  true
}

if divisible_by; then
  echo true
else
  echo false
fi

答え2

x=divisible_byこのdivisible_by関数は呼び出されません。あなたができることは

divisible_by
x=$?

(しかし、これはこの場合は悪いアプローチですset -e

divisible_by () {
[...]
echo $divisible
}

x=$(divisible_by)
[...]

答え3

次の行を変更する必要があります。

  if [ $under_test % $check -ne 0 ]; then

入力する

  if [ "$(($under_test % $check))" -ne 0 ]; then

それ以外の場合、test([)はあまりにも多くの引数を提供します。

私がしたことはプログラムを実行するだけでした。

under_test=12
from=2
to=4
divisible=0
for ((check=from; check<=to; check++)) {
  echo "check= $check"
  if [ $under_test % $check -ne 0 ]; then
    divisible=1
  fi  
}

最初に動作するようにしてください。

別の問題は、関数から値を返すことです。

divisible_by () {
  under_test=12
  from=2
  to=4
  divisible=0
  for ((check=from; check<=to; check++)) {
    echo "check= $check"
    if [ "$(($under_test % $check))" -ne 0 ]; then
      divisible=1
    fi  
  }
  mydivisible=$divisible
}

divisible_by
x=$mydivisible
if [ "$x" -eq 0 ]; then
  echo "true"
else
  echo "false"
fi

return は関数値を返さないからです。

実行すると、次の出力が提供されます。

check= 2
check= 3
check= 4
true

関連情報