2012-05-17 4 views
1

Мне нужно научить себя скрипту bash. Я читаю эту книгу, и она имеет следующий код:Начиная с bash scripting

#!/bin/bash 
# hello.sh 
# This is my first shell script! 

declare -rx SCRIPT="hello.sh" 
declare -rx who="/usr/bin/who" 
declare -rx sync="/bin/sync" 
declare -rx wc="/usr/bin/wc" 

# sanity checks 

if test -z "$BASH" ; then 
    printf "$SCRIPT:$LINENO: please run this script with the BASH shell\n" >&2 
    exit 192 
fi 

if test ! -x "$who" ; then 
    printf "$SCRIPT:$LINENO: The command $who is not available - aborting\n" >&2 
    exit 192 
fi 

if test ! -x "$sync" ; then 
    printf "$SCRIPT:$LINENO: the command $sync is not available - aborting\n">&2 
    exit 192 
fi 

if test ! -x "$wc" ; then 
    printf "$SCRIPT:$LINENO: the command $wc is not available - aborting\n" >&2 
    exit 192 
fi 

USERS = `$who | $wc -l` 
if [ $USERS -eq 0 ] ; then 
    $sync 
fi 

exit 0 

Когда я бегу, я получаю следующее сообщение об ошибке:

hello.sh: line 32: USERS: command not found 
hello.sh: line 33: [: -eq: unary operator expected 

Я действительно не знаю, что я делаю неправильно , Разве мне не разрешено назначать ПОЛЬЗОВАТЕЛЯ для вывода командной строки таким образом? Если я запустил эту строку в командной строке, это тоже не сработает. Есть идеи?

Благодаря

+0

Есть ли конкретная причина, вы должны научиться Баш? Каждый раз, когда я начинаю с небольшого сценария bash, думая, что это слишком просто сделать в Python, я в конечном итоге конвертирую его в Python позже. – robert

+0

Это очень плохой скрипт качества. Отличным ресурсом является [Bash Guide] (http://mywiki.wooledge.org/BashGuide) вместе с [Bash Pitfalls] (http://mywiki.wooledge.org/BashPitfalls) и [FAQ по Bash] (http: //mywiki.wooledge.org/BashFAQ). –

+0

Я проверю это руководство. Благодарю. Мне нужно учиться баху для моей стажировки. Мне жаль, что это был просто python, но, видимо, инструменты, которые я буду использовать, требуют bash. – de1337ed

ответ

4

Заменить

USERS = `$who | $wc -l` 

с

USERS=`$who | $wc -l` 
+0

О, ничего себе. Почему это имеет значение? – de1337ed

+1

Пространства отмечают разрыв между командами и аргументами. –

+2

Потому что это не так сложно, как язык программирования. В оболочке вы не можете узнать, что вы сделали неправильно, если не знаете. :-(Чтение страницы man для bash действительно помогло мне учиться, потому что это красно и плотно. :-) – jpaugh

5

удалить пробелы вокруг присвоения =:

USERS=`$who | $wc -l` 

Или это будет interpr eted как команда USERS с двумя параметрами = и `% who | $ Туалет -l`

2

В Bash (на самом деле во многих оболочках) вы не можете иметь пробелы между именем переменной и символ =

в этом случае вам нужно написать

USERS=`command` 

или

USERS=$(command) 

Переменная иногда действует как макрос C++. Если переменные ПОЛЬЗОВАТЕЛИ пусты, и вы наберете это:

if [ $USERS -eq 0 ] ; then 

оно будет интерпретированы как

if [ -eq 0 ] ; then 

и -eq не унарный оператор. чтобы сделать это правильно вам нужно писать:

if [ "$USERS" -eq 0 ] ; then 

быть истолковано

if [ "" -eq 0 ] ; then