Tôi muốn tạo một tập lệnh để kiểm tra xem người dùng có tồn tại không. Tôi đang sử dụng logic dưới đây:
# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
Vì vậy, nếu người dùng tồn tại, thì chúng ta đã thành công, người khác không tồn tại. Tôi đã đặt lệnh trên trong tập lệnh bash như dưới đây:
#!/bin/bash
getent passwd $1 > /dev/null 2&>1
if [ $? -eq 0 ]; then
echo "yes the user exists"
else
echo "No, the user does not exist"
fi
Bây giờ, tập lệnh của tôi luôn nói rằng người dùng tồn tại bất kể điều gì:
# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists
Tại sao điều kiện trên luôn luôn đánh giá là ĐÚNG và nói rằng người dùng tồn tại?
Tôi làm sai ở đâu?
CẬP NHẬT:
Sau khi đọc tất cả các phản hồi, tôi thấy vấn đề trong kịch bản của mình. Vấn đề là cách tôi chuyển hướng getent
đầu ra. Vì vậy, tôi đã loại bỏ tất cả các công cụ chuyển hướng và làm cho getent
dòng trông như thế này:
getent passwd $user > /dev/null
Bây giờ kịch bản của tôi đang hoạt động tốt.
getent
và if
câu lệnh của bạn ? Điều đó sẽ gây ra $?
để kiểm tra trạng thái thoát echo
, không phải cuộc gọi của bạn getent
.
2>&1
thay vì 2&>1
.
$1
không được đặt, câu lệnh if sẽ trả về true. Từ thử nghiệm của tôi, giải pháp sẽ là bọc $1
trong dấu ngoặc kép : getent passwd "$1" > /dev/null 2&>1
.
$?
bạn nhận được mã trả về củatest
lệnh. Xem câu trả lời dưới đây.