2013-02-12 23 views
8

tôi cố gắng để tìm thấy một quy trình cụ thể có chứa các thuật ngữ "someWord" và hai thuật ngữ khác được đại diện bởi $ 1 và $ 2pgrep -f với nhiều đối số

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

trả về

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

Điều gì xảy ra biểu thức chính quy của tôi? Làm điều đó pgrep trực tiếp trong vỏ hoạt động tốt.

Trả lời

8

Tốt thưa ông, có lẽ đây

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

hay này

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

Thứ nhất, không có lý do gì để quấn lệnh pgrep của bạn trong bất cứ điều gì. Chỉ cần sử dụng trạng thái thoát của nó:

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

Nếu pgrep thành công, bạn sẽ trả về 1; nếu không, bạn sẽ trả về 0. Tuy nhiên, tất cả những gì bạn đang làm là đảo ngược các mã thoát dự kiến. Những gì bạn có thể muốn làm chỉ đơn giản là để cho các pgrep là tuyên bố cuối cùng của chức năng của bạn; sau đó mã thoát của pgrep sẽ là mã thoát của hàm của bạn.

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

rằng có thể đúng và tôi sẽ kiểm tra nó nhưng không phải là regex của tôi bị che khuất như nó sẽ hiển thị "someWord . * foo bar. * "nhưng phải là" someWord. * foo. * bar "? – tommsen

+0

Có vẻ như '$ 1' được đặt thành" foo bar "và' $ 2' không được đặt ở tất cả. Bạn có thể thêm nhiều 'test.sh' vào câu hỏi không? – chepner

0

Nếu bạn thực sự muốn làm điều gì đó trong trường hợp lệnh của bạn trả về một lỗi:

cmd="pgrep -f $regex" 

if ! $cmd; then 
    echo "cmd failed." 
else 
    echo "ok." 
fi 
Các vấn đề liên quan