在fish shell中很难找到条件语法。有没有人有关于如何编写if,with ands和ors的解释的链接?
特别是我想写
if not $status
do a command
end
在上一个命令返回不成功时执行命令。我该怎么做?
答案 0 :(得分:6)
请参阅http://fishshell.com/docs/current/commands.html#if和http://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
然后还有not
,and
和or
命令,您可以使用
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之前的鱼版本中,您需要在begin
或end
的条件周围添加and
和or
,因为它被解释为奇怪
所以你必须这样做
如果开始命令;或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
的值,并检查条件中的变量。