2014-12-10 15 views
14

Vì vậy, tôi cần kiểm tra xem tên người dùng có nằm trong/etc/passwd chứa tất cả người dùng trong lớp của tôi không, nhưng tôi đã thử một vài kết hợp khác nhau nếu câu lệnh và grep không thành công. Điều tốt nhất tôi có thể đưa ra là dưới đây, nhưng tôi không nghĩ rằng nó hoạt động đúng. Logic của tôi đằng sau nó là nếu grep là null, người dùng không hợp lệ.Làm thế nào để kiểm tra xem grep không có đầu ra?

send_email() 
{ 
    message= 
    address= 
    attachment= 
    validuser=1 
    until [ "$validuser" = "0" ] 
    do 
    echo "Enter the email address: " 
    read address 
    if [ -z grep $address /etc/passwd ] 
     then 
    validuser=0 
    else 
     validuser=1 
    fi 
    echo -n "Enter the subject of the message: " 
    read message 
    echo "" 
    echo "Enter the file you want to attach: " 
    read attachment 
    mail -s "$message" "$address"<"$attachment" 
    done 
    press_enter 
} 

Trả lời

10

Sử dụng getent và kiểm tra mã thoát của grep. Tránh sử dụng/etc/passwd. Tương đương trong vỏ:

> getent passwd | grep -q valid_user 
> echo $? 
0 

> getent passwd | grep -q invalid_user 
> echo $? 
1 
20

Chỉ cần làm một đơn giản nếu như thế:

if grep -q $address /etc/passwd 
then 
    echo "OK"; 
else 
    echo "NOT OK"; 
fi 

Các tùy chọn -q được sử dụng ở đây chỉ để chắc grep yên tĩnh (không sản xuất ...)

+0

này nếu bạn không muốn giữ lại kết quả – RousseauAlexandre

+0

Làm thế nào điều này có thể được kết hợp với một bài kiểm tra giá trị biến lớn hơn 0? một cái gì đó như 'nếu grep -q $ địa chỉ/etc/passwd && $ val> 0' –

2

Kiểm tra -z là cho các chuỗi biến mà grep không đưa ra. Để cung cấp một giá trị từ lệnh grep của bạn, đặt nó bên trong $():

if [ -z $(grep $address /etc/passwd) ] 
+0

Tôi đã thử cách này, nhưng nó vẫn cho phép tôi nhập người dùng không hợp lệ ... – Duncan

+0

Bạn có thể thử thêm dấu ngoặc kép không? nếu [-z "$ (grep $ địa chỉ/etc/passwd)"] Chỉnh sửa: Ngoài ra, hãy chuyển toàn bộ đoạn mã và lệnh gửi thư sang mệnh đề khác nếu bạn không muốn chúng chạy cho người dùng không hợp lệ . – alienchow

2

mảnh của bạn mã

if [ -z grep $address /etc/passwd ] 

Bạn chưa lưu kết quả của grep $address /etc/passwd trong một biến. trước khi đặt nó vào câu lệnh if và sau đó kiểm tra biến để xem biến đó có trống không.

Bạn có thể thử nó như giải pháp đơn giản hơn

check_address=`grep $address /etc/passwd` 
    if [ -z "$check_address" ] 
     then 
    validuser=0 
    else 
     validuser=1 
    fi 
Các vấn đề liên quan