Проблема проверки аргументов в скрипте Bash - PullRequest
5 голосов
/ 26 мая 2009

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

Так что в основном я думал, что смогу просто сделать ...

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

Однако, похоже, что Bash не имеет и должен использовать для if, поэтому я решил, что могу просто использовать вложенные 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

РЕДАКТИРОВАТЬ II:

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

Ответы [ 2 ]

19 голосов
/ 26 мая 2009
if [ $# -ne 3 -a "$3" -ne "1" ]; then
  exit 0
fi

Для справки

-a = and
-o = or

Или вы можете просто использовать use:

if [[ $# != 3 && "$3" != "1" ]]; then
2 голосов
/ 26 мая 2009

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

http://bash -hackers.org / вики / doku.php / команды / classictest # and_and_or а также http://bash -hackers.org / вики / doku.php / синтаксис / CCMD / conditional_expression

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

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

...