ожидается целочисленное выражение в Fedora / UNIX - PullRequest
0 голосов
/ 01 марта 2020

Я пытался составить сценарий для печати Последовательности Фибоначчи, но бежал по некоторым контрольно-пропускным пунктам.

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

в терминале.

Любая помощь будет принята с благодарностью

1 Ответ

0 голосов
/ 01 марта 2020

Руководство POSIX для чтения. см. здесь

NAME

    read - read from standard input into shell variables

SYNOPSIS

    read [-r] var...

DESCRIPTION

Вы должны использовать

read -r n

Хорошо -r необязательно.


Это решение использует $(()) для математического / арифметического c контекста.

#!/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 для проверки ввода пользователя, если это действительно int.
  • Я сделал не меняю весь ваш код, я просто изменяю / исправляю то, что выдавало ошибку.
  • Добавить -r и -p - это не POSIX, но -r - это.

  • Используйте read n, если -p не работает для вас, и используйте эхо для вывода некоторых сообщений на стандартный вывод, как и вы.

...