unexpected operator при запуске командного файла в интерпретаторе Unix

unexpected operator при запуске командного файла в интерпретаторе Unix

01.10.2018 12:28:38 Просмотров 18 Источник

Только начал изучать создание командных процедур в Unix. Пытаюсь написать простой командный файл, содержащий цикл. Вот мой код (Он должен выводить на стандартный вывод слово Unix заданное при запуске число раз.)

n=$1
while test $n -gt 0
do
echo Unix
n=`expr $n - 1`
done

Создаю командный файл:

chmod +x unix_print

Вызываю:

/usr/home/files/unix_print

Получаю ошибку:

 test: -gt: unexpected operator

Притом если я запускаю эти команды не из командного файла, то всё работает, как предполагается. Подскажите, пожалуйста, что я делаю не так.

У вопроса есть решение - Посмотреть?

Ответы - unexpected operator при запуске командного файла в интерпретаторе Unix / unexpected operator при запуске командного файла в интерпретаторе Unix

Piop

01.10.2018 02:23:14

Нужно было просто заключить $n в двойные кавычки:

n=$1
while test "$n" -gt 0
do
echo Hello World!
n=`expr "$n" - 1`
done
Fat-Zer

02.10.2018 02:22:27

Вводя n=$1 ты указываешь, чтобы переменной n присвоилось значение первого позиционного параметра, но при вызове (/usr/home/files/unix_print) ты не передаёшь этого параметра и соответственно в вызове утилиты test он просто пропускается. и он превращается в test -gt 0, что с её точки зрения является не корректным, о чём она и сообщает.

Правильный вызов выглядел бы, например, так (внимание на аргумент 3):

/usr/home/files/unix_print 3

Прочая критика

  • В отрывке приведённого кода отсутствует she-bang (#!/bin/sh), понимаю, что это, по всей видимости, упрощение для поста, но всё же это вызывает некоторое недоверие...
  • Вместо expr обычно используют встроенный в POSIX-совместимую оболочку оператор вычисления арифметического выражения ($(( ))).
  • Как ты уже заметил, хорошей практикой является брать в кавычки всё, для чего не доказана необходимость обратного.
https://ru.stackoverflow.com/questions/887534/unexpected-operator-%d0%bf%d1%80%d0%b8-%d0%b7%d0%b0%d0%bf%d1%83%d1%81%d0%ba%d0%b5-%d0%ba%d0%be%d0%bc%d0%b0%d0%bd%d0%b4%d0%bd%d0%be%d0%b3%d0%be-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%b2-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bf%d1%80%d0%b5%d1%82%d0%b0%d1%82%d0%be%d1%80%d0%b5-unix/887997#comment1450187_887997
Все эти танцы с дополнительной переменной в данном примере не нужны: for dummy in $(seq ${1:-1}); do echo Unix; done. Как-то так.
https://ru.stackoverflow.com/questions/887534/unexpected-operator-%d0%bf%d1%80%d0%b8-%d0%b7%d0%b0%d0%bf%d1%83%d1%81%d0%ba%d0%b5-%d0%ba%d0%be%d0%bc%d0%b0%d0%bd%d0%b4%d0%bd%d0%be%d0%b3%d0%be-%d1%84%d0%b0%d0%b9%d0%bb%d0%b0-%d0%b2-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bf%d1%80%d0%b5%d1%82%d0%b0%d1%82%d0%be%d1%80%d0%b5-unix/887997#comment1450189_887997
О, нашёл правильный вариант вызова seq: seq 1 1 ${1:-0}.
Закрыть X