2013-02-12 63 views
8

我試圖找到包含「someWord」一詞以及其他兩項由$ 1和$ 2p纖ep -f使用多個參數

7 regex="someWord.*$1.*$2" 
8 echo "$regex" 
9 [ `pgrep -f $regex` ] && return 1 || return 0 

返回

./test.sh foo bar 
someWord.*foo bar.* 
./test.sh: line 9: [: too many arguments 

發生什麼代表的具體過程我的正則表達式?直接在shell中執行pgrep可以正常工作。

回答

8

好先生,也許這

[[ `pgrep -f "$regex"` ]] && return 1 || return 0 

或本

[ "`pgrep -f '$regex'`" ] && return 1 || return 0 
0

首先,我們沒有理由在什麼來包裝你pgrep命令。只要使用它的退出狀態:

pgrep -f "$regex" && return 1 || return 0. 

如果pgrep成功,你會返回1;否則,您將返回0.但是,您所做的只是逆轉預期的退出代碼。你可能想要做的只是讓pgrep成爲你函數的最後一個陳述;那麼退出代碼pgrep將是您函數的退出代碼。

something() { 
    ... 
    regex="someWord.*$1.*$2" 
    echo "$regex" 
    pgrep -f $regex 
} 
+0

這可能是真的,我會測試,但不是我的正則表達式阻礙,因爲它顯示「someWord 。* foo bar。*「但應該是」someWord。* foo。* bar「? – tommsen 2013-02-12 17:06:02

+0

它看起來像$ 1被設置爲「foo bar」,而$ 2沒有被設置。你可以在問題中添加更多的'test.sh'嗎? – chepner 2013-02-12 18:14:11

0

如果你真的想要做一些,以防您的命令返回一個錯誤:

cmd="pgrep -f $regex" 

if ! $cmd; then 
    echo "cmd failed." 
else 
    echo "ok." 
fi