2012-02-13 9 views
19

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

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

$1 и $2. Код будет выводить:

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

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

+0

Привет, Янсон, я отредактировал ваш вопрос для вас. В будущем рассмотрите возможность использования 4-х пространственного отступа во всем, что должно рассматриваться как «код» в ваших сообщениях здесь. –

+0

спасибо, я думал, что отступ означал использование вкладки, но это не сработало – JA3N

ответ

17

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

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

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

P.S.

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

+0

И с этим .. моя домашняя работа выполнена .. Спасибо за вашу помощь. – JA3N

+0

как если [[$ 1! = "Файл" -a $ 1! = 'Dir']]; ? – JA3N

+0

@JansonChung '[[]]' разрешает больше синтаксиса C-типа, поэтому вы действительно можете сделать 'if [[$ 1! =" File "&& $ 1! =" Dir "]]; затем ... ' – SiegeX

39

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

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

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

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

+0

wth ... Могу ли я купить вам пиво? lol ... – user1872384

+0

Я использовал ваш подход и не работал, это действительно работает в случае: if ["a" == "a"]; затем echo hi; fi Без пробелов между значениями и знаками равенства –

Смежные вопросы