Fish Shell:基于$ status的条件执行?

时间:2016-08-30 15:38:57

标签: fish

在fish shell中很难找到条件语法。有没有人有关于如何编写if,with ands和ors的解释的链接?

特别是我想写

if not $status
  do a command
end

在上一个命令返回不成功时执行命令。我该怎么做?

3 个答案:

答案 0 :(得分:6)

请参阅http://fishshell.com/docs/current/commands.html#ifhttp://fishshell.com/docs/current/tutorial.html#tut_conditionals

如果结构如下所示

Fish:

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

然后还有notandor命令,您可以使用

if not COMMAND1; or COMMAND2
    # and so on

如果你真的想测试一个变量(例如$ status),你需要使用test作为命令,比如

if test $status -eq 0

请记住每个命令后$ status都会发生变化,所以如果你需要使用早期命令的状态(在提示中很常见),你需要做Joachim Pileborg所说的,把它保存到另一个变量。

另外,test引用了一些问题(因为它是遵守POSIX的少数几个部分之一) - 如果test $foo -eq 0 $ foo未定义,则测试将出错out,如果它在test -n $foo中未定义,则测试将为真(因为POSIX要求使用一个参数进行测试为真)。

作为旁注,在2.3.0之前的鱼版本中,您需要在beginend的条件周围添加andor,因为它被解释为奇怪

所以你必须这样做

如果开始命令;或COMMAND2;结束       #为status = 0做一些事情

答案 1 :(得分:2)

最短的简短形式是

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

假设您从" the_previous_command"

获得$status

答案 2 :(得分: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的值,并检查条件中的变量。