Условия Bourne Shell - PullRequest
       5

Условия Bourne Shell

2 голосов
/ 20 августа 2011
if [`read -n1 -s`='y']

вызывает

. / Bzfsctl.sh: строка 17: [= y]: команда не найдена

Даже

if [1=1]

производит:

. / Bzfsctl.sh: строка 17: [1 = 1]: команда не найдена

РЕДАКТИРОВАТЬ После правильного добавления в пробелах получить

. / Bzfsctl.sh: строка 16: [: -eq: ожидается унарный оператор

с

if [ `read -n1 -s` = 'y' ]
then
echo 'killing process ...'
else
echo 'Aborted'
fi

Ответы [ 3 ]

2 голосов
/ 20 августа 2011

Вы должны быть осторожны с пробелами в ваших командах.

if [ 1 = 1 ]; then echo Ok ; fi
    ^ ^ ^ ^

Все четыре из этих пробелов необходимы.

Если вы хотите прочитать один символ и проверить его:

read -n1 input
if [ $input = "y" ] ; then echo Got a Yes ; fi

Когда вы пишете if something ; then ..., оболочка выполняет something и затем действует в зависимости от кода возврата этой команды.

[ это не «синтаксис», это программа (или встроенная оболочка), которая также называется test.

Итак:

if [ $a = $b ] ; then ...

фактически запускает исполняемый (или встроенный) [ с аргументами $a, =, $b и ].

Если вы не ставите скобки, вам нужно, чтобы между if и ; была обычная исполняемая команда, которая возвращает 0 в случае успеха.

0 голосов
/ 20 августа 2011

При поиске на справочной странице bash команда чтения сообщает следующее о возвращаемом значении.

read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]


          If  no  names are supplied, the line read is assigned to the variable REPLY.  The return code
          is zero, unless end-of-file is encountered, read times out (in which case the return code  is
          greater than 128), or an invalid file descriptor is supplied as the argument to -u.

Так что это не дает вам ничего проверить. Вы можете передать имя как это:

read -n 1 YesNo
if [ $YesNo = 'Y' ] ; then
   echo 'Yes'
else
   echo 'No'
fi

Или вы можете использовать встроенную переменную REPLY.

0 голосов
/ 20 августа 2011

Так и должно быть

if [ 1 = 1 ]; then
echo "equal";
else
echo "not-equal";
fi

если вы пишете как if[1=1], тогда shell interpreter будет рассматривать 1 как command, поэтому вы должны указать space after [ and before ]

как if [ 1 = 1 ]

надеюсь, что поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...