既然你想看到您echo
命令的輸出,需要將標準輸出輸出從回報(退出)代碼分開:
#!/bin/bash
func(){
local a=$1 b=$2
echo "$a" # stdout output
echo "$b"
if ((a > b)) # see below for how this could be simplified.
then
return 0 # set exit code
else
return 1
fi
}
c=1 d=4
while ! func $c $d
do
((c++))
done
這樣的話,你可以自由地使用該函數直接(前綴!
否定測試的結果),而沒有命令替換,並讓其返回(退出)的代碼驅動的while
循環條件結果(的退出代碼意思是成功,其他意思失敗)。
僅使用! func $c $d
作爲條件,func
的標準輸出簡單地按原樣打印。
附錄:Billy Wayne McCann's answer指出,沒有嚴格的需要使用明確的return
語句設置退出代碼(但有沒有必要使用test
[1])。
((a > b))
可以通過自身使用作爲函數的最後一條語句,設置退出代碼隱含:
如果沒有明確的return
聲明,它是一個功能的最後命令,設置其退出代碼(在沒有exit
聲明的情況下,類似地適用腳本)。
((...))
設置退出代碼以1
,如果...
計算結果爲0
,並1
否則(任意非負的結果)。如果表達式爲真,那麼布爾表達式(例如a > b
)會導致1
,否則返回0
。因此,((a > b))
本身做同樣的事隱,上述if
聲明確實明確:
func(){
local a=$1 b=$2
echo "$a" # stdout output
echo "$b"
((a > b)) # exit code implicitly set to 0, if test *succeeds*, 1 otherwise
}
[1]使用test
或[ ... ]
是POSIX兼容的方法來評估的條件。除非你的代碼必須是符合POSIX標準,bash的[[ ... ]]
和((...))
(用於算術布爾測試)是更好的選擇 - 看https://stackoverflow.com/a/29320710/45375
對不起,回聲用於調試。我瞭解到,我們應該返回退出狀態而不是價值。 – 2015-04-03 03:43:24
@CodingTheLife:這就是這個解決方案的功能:函數的_exit code_決定何時退出循環。因此,無論輸出形成條件的命令如何產生都會通過。如果你不需要輸出,使用'>/dev/null'來抑制stdout,'2>/dev/null'來抑制stderr,'>/dev/null'來抑制兩者。由於你的問題表明「回聲不起作用」 - 你認爲這個解決方案確實「使它們工作」是什麼意思? 「 – mklement0 2015-04-03 03:49:05