Fedora/UNIX 中预期的整数表达式

integer expression expected in Fedora/UNIX

我一直在尝试编写打印斐波那契数列的脚本,但 运行 遇到了一些障碍。

1  #!/bin/sh
2  echo "Program to Find Fibonacci Series"
3  echo "How many number of terms to be generated ?"
4  read
5  n=$REPLY
6  echo "Fibonacci Series up to $n terms :"
7  x=0
8  y=1
9  i=2
10  echo "$x"
11  echo "$y"
12  while [ $i -lt $n ] 
13  do
14    i=`expr $i+1`
15    z=`expr $y+$x`
16    echo "$z"
17    x=$y
18    y=$z
19  done
20
21  exit 0

特别是第 12-13 行,它一直在打印

integer expression expected

在终端中。

如有任何帮助,我们将不胜感激

POSIX阅读手册。见 here

NAME

    read - read from standard input into shell variables

SYNOPSIS

    read [-r] var...

DESCRIPTION

你应该使用

read -r n

-r是可选的


此解决方案将 $(()) 用于 math/arithmetic 上下文。

#!/bin/sh

echo "Program to Find Fibonacci Series"
read -rp "How many number of terms to be generated ? " n

 case $n in
  *[!0-9]*) printf 'You entered %s which is not an int, please try again shall we?\n' "$n"  >&2
     exit 1;;
     '') printf "Nothing was given, please try again..."
     exit 1;;
esac

echo "Fibonacci Series up to $n terms :"

x=0 y=1 i=2

printf '%s\n' "$x" "$y"
while [ $i -lt $n ]; do
  i=$((i+1))
  z=$((y+x))
  echo "$z"
  x=$y
  y=$z
done
  • 我添加了 case 语句来验证用户输入是否确实是一个整数。
  • 我没有更改你的整个代码我只是 change/fix 是什么导致了错误。
  • 添加 -r-p 不是 POSIX 但 -r 是。

  • 如果 -p 不适合您,请使用 read n 并使用 echo 像您所做的那样将一些消息输出到标准输出。