2016-08-30 25 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」獲得