Сравнение параметра командной строки со строкой - PullRequest
29 голосов
/ 13 февраля 2012

Вот мой код:

#!/bin/bash
if [ "$#" -ne 2 ] ; then
        echo "$0: exactly 2 arguments expected"
        exit 3
fi

if [$1 != "file" -a $1 != 'dir'] ; then
        echo "$0: first argument must be string "file" or "dir""
        exit 1
elif [-e $2 -a -r $2]; then
        if ["$1" = "file" -a -f $2] ; then
                echo YES
        elif ["$1" = "dir" -a -d $2] ; then
                echo YES
        else
                echo NO
        fi
        exit 0
else
        echo "$0: $2 is not a readable entry"
        exit 2
fi

Если я запускаю ./lab4 file filename1, он проверит, является ли первый параметр строкой «file» или «dir», затем, если первый параметр - «file», а filename1 - файл, будет напечатано yes. То же самое для режиссера.

Он не распознает $1 и $2. Код выведет:

./lab04Q2: line 7: [file: command not found
./lab04Q2: line 10: [-e: command not found

хотя я и поставил 2 параметра при запуске программы.

Ответы [ 2 ]

48 голосов
/ 13 февраля 2012

Попробуйте следующие 3 строки в bash:

if [ "a" == "a" ]; then echo hi; fi
if ["a" == "a" ]; then echo hi; fi
if ["a" == "a"]; then echo hi; fi

Вы увидите, что работает только первый, а два других - нет. т. е. нехватка пробелов - это причина, по которой ваше выражение не работает.

Приведенный выше пример также предполагает, что вы можете проверить синтаксис bash непосредственно в приглашении bash. Вы можете сделать это правильно, прежде чем включать их в свой сценарий.

23 голосов
/ 13 февраля 2012

Проблемы связаны с тем, что [ на самом деле является командой. На самом деле это псевдоним для команды test. Для того, чтобы это работало правильно, вам нужно добавить пробел после [ как в:

if [ $1 != "file" -a $1 != 'dir' ] ;

Сделайте это для всех ваших экземпляров [, у которых после них нет пробела.

приписка

Поскольку вы используете bash в качестве интерпретатора, я настоятельно рекомендую вам использовать [[ ]] вместо [ ] для ваших тестов, поскольку первый намного более эффективен, чем последний без недостатков; нет необходимости в пробелах - один из них

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