2016-08-30 3 views
1

В оболочке рыбы синтаксис условных выражений трудно найти. Кто-нибудь имеет ссылку на объяснение того, как писать if, с помощью ands и ors?

В частности, я хотел бы написать

if not $status 
    do a command 
end 

Чтобы сделать команду, когда предыдущая команда вернула неуспех. Как мне это сделать?

+0

Возможный дубликат [Как получить статус предыдущей команды в скрипке рыбы] (http://stackoverflow.com/questions/34721446/how-to-get-the-status-of-previous-command-in-fish-script) – faho

+0

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

ответ

4

См. http://fishshell.com/docs/current/commands.html#if и http://fishshell.com/docs/current/tutorial.html#tut_conditionals.

рыбы, если структура выглядит следующим образом:

if COMMAND 
    # do something if it succeeded 
else 
    # do something if it failed ($status != 0) 
end 

Тогда есть также not, and и or команды, которые вы можете использовать как

if not COMMAND1; or COMMAND2 
    # and so on 

Если вы действительно хотите проверить переменную (например, $ status), вам необходимо использовать команду test, такую ​​как

if test $status -eq 0 

Помните, что после каждой команды изменяется статус $, поэтому, если вам нужно использовать статус более ранней команды (обычно в подсказках), вам нужно сделать то, что сказал Йоахим Пилеборг, сохраните ее в другой переменной.

Кроме того, test имеет некоторые проблемы с кавычками (потому что это одна из немногих частей рыбы придерживаться POSIX) - если в test $foo -eq 0 $ Foo неопределен, тест выдаст ошибку, и если это не определено в test -n $foo, в тест будет правдой (поскольку POSIX требует, чтобы тест с одним аргументом был истинным).


Как заметка на полях, в рыбьем версиях до 2.3.0, вам нужно добавить begin и end вокруг состояния с and или or, потому что это было истолковано причудливо.

Таким образом, вы должны были бы сделать

если начать COMMAND; или COMMAND2; конец # сделать что-то для состояния = 0

1

Я использую переменную статуса для отображения ее в приглашении, если она отлична от нуля. Для этого я использую следующую функцию:

function __pileon_status_prompt 
     set -l __status $status 
     if test $__status != 0 
       printf '[%s%s%s]' (set_color red) $__status (set_color normal) 
     end 
end 

Как вы можете видеть, что я установить локальную переменную со значением $status и проверки этой переменной в состоянии.

+0

Спасибо.Это «рекомендуемый» способ сделать это? – pitosalas

2

Кратчайший короткая форма будет

the_previous_command; or do_a_command 
# ..................^^^^^ 

Предполагая, что вы получите ваш $status от «the_previous_command»

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