2016-08-30 74 views
1

在鱼壳中,很难找到条件语法。有没有人有解释如何编写if,withs和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

不是一个dup。问题不在于如何获得状态,而在于如何根据状态最佳地分配代码。 – pitosalas

回答

4

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

鱼的,如果结构是这样的:

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 

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

if test $status -eq 0 

请记住,每个命令后$状态会发生变化,所以如果您需要使用早期命令的状态(常见于提示),您需要执行Joachim Pileborg所说的操作,并将其保存到另一个变量中。

此外,test有引号的一些问题(因为它是鱼的少数地区之一,坚持POSIX) - 如果test $foo -eq 0 $ foo是不确定的,测试将错误出来,如果在test -n $foo,未定义测试将是真实的(因为POSIX要求用一个参数进行测试是正确的)。


一点题外话,在2.3.0之前版本中的鱼,你需要与andor添加beginend周围的条件,因为它是古怪的解释。

所以你必须做

如果开始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”获得