2013-08-07 2 views
2

Прошло некоторое время с тех пор, как я написал сценарий в 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' 

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

У кого-то была аналогичная проблема и найдено решение?

+1

Я думаю, что это должно быть 'if [$ # -eq 0]'. '=' - сравнение строк, как описано [здесь] (http://tldp.org/LDP/abs/html/comparison-ops.html) –

+2

Квадратные скобки - это не просто синтаксис, '[' на самом деле команда оболочки , Как и любая команда, ей нужны пробелы, чтобы отделить ее от своих аргументов (аналогично, 'if' нуждается в пробеле после нее). '[' Работает по-разному в зависимости от того, сколько аргументов оно получает (его последний аргумент должен быть ')') –

ответ

2

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

Баш-3.2 $ ./isingelogd
./isingelogd
./isingelogd: строка 3: если [0 = 0]: команда не найдена
./isingelogd: Строка 4: ошибка синтаксиса около неожиданной лексемы then'
./isingelogd: line 4:
затем»

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

[ .. ] являются действительными командами, и, как и все команды, их нужно разделять пробелами. Параметр = является параметром команды [, а также должен быть окружен пробелом. Изменить строку # 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 
+0

в чем разница betwen -eq vs. = и -gt vs.>? – BlackMamba

+0

Thx so much :) Теперь он работает, забыл о важности пробелов. Спасибо всем за очень четкий ответ! –

2

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 
Смежные вопросы