Написание скрипта Fish Shell с необязательным аргументом

У меня есть сценарий оболочки рыбы, поведение которого по умолчанию заключается в отправке электронного письма по завершении. Я хотел бы изменить его, чтобы он отвечал на аргумент nomail из командной строки. Так, например, запуск скрипта обычно приводит к получению электронного письма:

michaelmichael: ~/bin/myscript

Но при запуске с переключателем nomail электронное письмо с подтверждением не будет отправлено:

michaelmichael: ~/bin/myscript nomail

Если я запускаю скрипт с аргументом nomail, он работает нормально. Без nomail $argv не определено и выдает ошибку. Я просмотрел документацию по рыбной оболочке, но не нашел ничего подходящего. Вот что у меня есть до сих пор

switch $argv
  case nomail
    ## Perform normal script functions
  case ???
    ## Perform normal script functions
    mailx -s "Script Done!"
end

Запуск этого вызывает следующую ошибку:

switch: Expected exactly one argument, got 0

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

Я предполагаю, что это довольно просто, но я просто не очень хорошо понимаю сценарии оболочки.


person michaelmichael    schedule 25.06.2010    source источник
comment
Будет полезнее, если вы опубликуете конкретное сообщение об ошибке.   -  person Dennis Williamson    schedule 25.06.2010
comment
добавлен. Извини за это.   -  person michaelmichael    schedule 25.06.2010


Ответы (2)


Оберните свой оператор switch следующим образом:

if set -q argv
    ...
end

Кроме того, я думаю, что ваш регистр по умолчанию должен быть case '*'.

person Dennis Williamson    schedule 25.06.2010
comment
Это сработало (хотя nomail должно быть регистром по умолчанию, а не '*'). Вот что я изменил на: if set -q argv; switch $argv; case nomail; echo Not sending mail.; case '*'; echo Unspecified switch.; end; else; echo sending mail.; end - person michaelmichael; 25.06.2010
comment
@michaelmichael: Под случаем по умолчанию я имею в виду значение по умолчанию оператора switch, которое выполняется, если ни один из указанных случаев не соответствует. Именно так, как у вас есть код в вашем комментарии. Извините, я неправильно прочитал ваш исходный код и ошибся ??? как будто это должно было быть switch по умолчанию. - person Dennis Williamson; 25.06.2010

Если вы предпочитаете использовать оператор switch, это также возможно:

switch (echo $argv)
  case nomail
    ## Perform normal script functions
  case '*'
    ## Perform normal script functions
    mailx -s "Script Done!"
end
person Jakub Kubrynski    schedule 04.01.2014