Я хочу створити сценарій, щоб перевірити, чи існує користувач. Я використовую логіку нижче:
# 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 поверне справжнє значення. З мого тестування, рішення було б обернути $1в подвійних лапках: getent passwd "$1" > /dev/null 2&>1.
$?ви отримуєте код поверненняtestкоманди. Дивіться відповідь нижче.