2013-02-12 13 views
8

próbuję znaleźć konkretny proces zawierający określenie "someWord" i dwa inne warunki reprezentowany przez 1 $ i $ 2pgrep -f z wieloma argumentami

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

która zwraca

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

Co się dzieje moje wyrażenie regularne? Robienie tego pgrep bezpośrednio w powłoce działa dobrze.

Odpowiedz

8

Dobry panie, może to

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

czy to

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

Po pierwsze, nie ma powodu, by zakończyć swoją komendę pgrep w cokolwiek. Wystarczy użyć swojego statusu wyjścia:

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

Jeśli pgrep powiedzie, będziesz return 1; w przeciwnym razie zwrócisz 0. Jednak wszystko, co robisz, odwraca oczekiwane kody wyjścia. Prawdopodobnie chcesz po prostu pozwolić, aby pgrep było ostatnim stwierdzeniem twojej funkcji; wtedy kod zakończenia pgrep będzie kod wyjścia funkcji.

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

że może być prawdą i będę go przetestować, ale nie jest moim regex utrudnione, gdyż wyświetla „someWord . * foo bar. * ", ale powinno być" someWord. * foo. * bar "? – tommsen

+0

Wygląda, że ​​'$ 1' jest ustawione na" pasek foo ", a' $ 2' w ogóle nie jest ustawione. Czy możesz dodać więcej "test.sh" do pytania? – chepner

0

Jeśli naprawdę chcesz coś zrobić w przypadku, gdy polecenie zwraca błąd:

cmd="pgrep -f $regex" 

if ! $cmd; then 
    echo "cmd failed." 
else 
    echo "ok." 
fi 
Powiązane problemy