2009-05-26 5 views
5

Так что в основном я пытаюсь проверить аргументы, переданные в скрипт. Если у него есть три аргумента, а третий аргумент равен 1, я хочу, чтобы он продолжался. Я также хочу, чтобы продолжить работу, если она имеет четыре аргумента, а третий аргумент не является 1.Проблема с проверкой аргументов в скрипте Bash

Поэтому в основном я думал, что я мог бы просто сделать ...

if ([ $# -ne 3 ] and [ "$3" -ne "2" ]) 
then 
exit 0 
fi 

Однако, кажется, что Bash не иметь и использовать для if's, поэтому я решил, что могу просто использовать вложенные if, но теперь он еще жалуется. Так что это то, что у меня есть ...

if [ $# -ne 3 ] 
then 
if [ "$3" -ne "1" ] 
then 

echo "Improper number of arguments. 
FORMAT make-csv-data <STUDY> <TAG> <MODE> <SELECT> 

Select can be left off if you want all data (Mode=1) 
" 
exit 0 

fi 
fi 
if [ $# -ne 4 ] 
then 
if [ "$3" -ne "2" ] 
then 

echo "Improper number of arguments. 
FORMAT make-csv-data <STUDY> <TAG> <MODE> <SELECT> 

Select can be left off if you want all data (Mode=1) 
" 
exit 0 

fi 
fi 

Итак, где я иду не так? Могу ли я не вставлять заявления в Bash? Есть ли способ сделать так, чтобы я вообще отсутствовал?

Спасибо за любую помощь, которую вы могли бы мне дать.


Новая задача ...

Теперь, по той или иной причине, то код не работает вообще. Нет ошибок или чего-то еще, это просто не работает. Он не проверяет количество аргументов. Я запускаю скрипт без каких-либо аргументов, и он просто пропускает его, как будто его даже нет.

Странная часть заключается в том, что я был уверен, что код работал вчера. Вернись сегодня, не так много. Любые идеи о том, в чем проблема? (Извините, но я должен удалить принятый ответ на это.)

if [[ $# = 3 && "$3" != "1" ]] 
then 

echo "Improper number of arguments. 
FORMAT make-csv-data <STUDY> <TAG> <MODE> <SELECT> 

Select can be omitted if all data is required (Mode=1) 
" 
exit 0 

fi 

if [[ $# > 4 ]] 
then 

echo "Improper number of arguments. 
FORMAT make-csv-data <STUDY> <TAG> <MODE> <SELECT> 

Select can be omitted if all data is required (Mode=1) 
" 
exit 0 

fi 

EDIT II:

Есть несколько вещей, что Bash оболочке не нравится об этом сценарии, что я пытаюсь делать. Я, вероятно, в конечном итоге переписал его на другом языке сценариев и сделаю еще несколько вещей, которые я имею в виду для проекта. Спасибо за помощь в любом случае.

+1

какая ошибка поживаешь? – Glen

ответ

19
if [ $# -ne 3 -a "$3" -ne "1" ]; then 
    exit 0 
fi 

Для справки

-a = and 
-o = or 

Или вы могли бы просто использовать применение:

if [[ $# != 3 && "$3" != "1" ]]; then 
+0

Спасибо за помощь. Это помогло мне и другим сценариям, над которыми я работал. –

2

Пожалуйста, см:

http://bash-hackers.org/wiki/doku.php/commands/classictest#and_and_or и http://bash-hackers.org/wiki/doku.php/syntax/ccmd/conditional_expression

Поскольку вы просто проверяете значения выхода/возврата с помощью «if», вам необходимо предоставить что-то, например. команда, которая предоставляет значимые результаты на основе ваших тестов. [такая команда, другая возможность - [[ключевое слово.

Фактические правильные примеры уже были упомянуты scragar выше, я не хочу просто повторить их :)

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