Я хочу создать скрипт, чтобы проверить, существует ли пользователь. Я использую логику ниже:
# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
Таким образом, если пользователь существует, то у нас есть успех, иначе пользователь не существует. Я поставил выше команду в скрипте bash, как показано ниже:
#!/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
Теперь мой сценарий всегда говорит, что пользователь существует независимо от того, что:
# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists
Почему вышеуказанное условие всегда оценивается как ИСТИНА и говорит, что пользователь существует?
Куда я иду не так?
ОБНОВИТЬ:
Прочитав все ответы, я обнаружил проблему в своем сценарии. Проблема была в том, как я перенаправлял getentвывод. Таким образом, я удалил все вещи перенаправления и сделал getentстроку такой:
getent passwd $user > /dev/null
Теперь мой скрипт работает нормально.
getentи вашим ifоператором? Это может привести $?к проверке состояния выхода echo, а не вашего вызова getent.
2>&1вместо 2&>1.
$1он не установлен, оператор if вернет true. Из моего тестирования, решение было бы обернуть $1в двойных кавычках: getent passwd "$1" > /dev/null 2&>1.
$?вы получите код возвратаtestкоманды. Смотрите ответ ниже.