Подтвердить что ты не робот

Сравнение параметра командной строки с строкой

Вот мой код:

#!/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, он будет проверять, является ли первый параметр строкой "файл" или "dir", а если первым параметром является "файл", а filename1 - файл, он будет печатать "да". То же самое для dir.

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

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

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

4b9b3361

Ответ 1

Попробуйте следующие 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. Вы можете получить его прямо перед тем, как включить их в свой script.

Ответ 2

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

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

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

P.S.

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