Mac Bash — не распознает, если [$#=0]

Прошло некоторое время с тех пор, как я написал сценарий в bash, поэтому я сделал небольшой сценарий, чтобы проверить все. Это мой сценарий (цитируемый текст какой-то голландский, не имеет большого значения):

#isingelogd
if[$#=0]
then
    echo "Geef user-id's op!" 1>$2 ; exit 1
fi
for uid in $*
do
    if who|grep $uid >dev/null
    then
            echo $uid is ingelogd
    else
            echo $uid is niet ingelogd
    fi
done

Если я пытаюсь запустить его, он говорит мне следующее:

bash-3.2$ ./isingelogd
./isingelogd
./isingelogd: line 3: if[0=0]: command not found
./isingelogd: line 4: syntax error near unexpected token `then'
./isingelogd: line 4: `then'

Если я проверю свою версию с помощью bash -v, я использую 3.2, которая, как я думал, поддерживает квадратные скобки.

Может у кого была похожая проблема и нашел решение?


person Jasper Vaneessen    schedule 07.08.2013    source источник
comment
Я думаю, что это должно быть if [ $# -eq 0 ]. = — это сравнение строк, как описано здесь   -  person    schedule 07.08.2013
comment
Квадратные скобки — это не просто синтаксис, [ на самом деле является командой оболочки. Как и любой команде, ей нужны пробелы после нее, чтобы отделить ее от аргументов (аналогично, if требует пробела после нее). [ работает по-разному в зависимости от того, сколько аргументов он получает (его последний аргумент должен быть ])   -  person glenn jackman    schedule 07.08.2013


Ответы (2)


Посмотрите на свои ошибки:

bash-3.2$ ./isingelogd
./isingelogd
./isingelogd: строка 3: if[0=0]: команда не найдена
./isingelogd: строка 4: синтаксическая ошибка рядом с неожиданным токеном then'
./isingelogd: line 4:
then'

Видите, что команда не найдена? у вас ошибка в скрипте.

[..] являются фактическими командами, и, как и все команды, они должны быть разделены пробелами. = является параметром команды [ и также должен быть окружен пробелом. Измените строку № 3 на эту:

if [ $# -eq 0 ]

Поскольку $# и 0 являются числовыми, вы должны использовать -eq для сравнения чисел, а не = для сравнения строк.

Попробуйте эти команды:

$ ls -li /bin/test
$ ls -li /bin/[

Вы увидите, что они имеют одинаковый номер инода. Это ссылки. (Да, [ и test встроены в оболочку, но они связаны со встроенными командами).

$ man test

предоставит вам все различные тесты, которые может выполнить [. Опять же, обратите внимание на разницу между -eq и = и -gt и >.

Обратите внимание на следующее:

if [ 54 > 123 ]
then
    echo "54 is greater than 123"
fi

Будет напечатано «54 больше, чем 123». Это не будет:

if [ 54 -gt 123 ]
then
   echo "54 is greater than 123"
fi
person David W.    schedule 07.08.2013
comment
в чем разница между -eq против = и -gt против ›? - person BlackMamba; 08.08.2013
comment
Большое спасибо :) Теперь все работает, забыл о важности пробелов. Спасибо всем за очень четкий ответ! - person Jasper Vaneessen; 08.08.2013

a.bash у меня работает на Mac. Содержание a.bash следующее:

#!/bin/bash

if [ $# == 0 ]; then
    echo "Usage da da do" 
fi

export A=$1
echo $A

затем выполните следующее:

\# ] ./a.bash

   Usage da da do
person iamauser    schedule 07.08.2013