У меня есть простой shell-скрипт для проверки существования пользователя, если нет, добавьте его
#!/usr/bin/bash
echo "Enter user"
read -r user
if [ "$(id -u "$user" &>/dev/null)" = 1 ]; then
echo "user existed"
else
useradd "$user"
echo "add password"
passwd "$user"
echo "$user" &>>text.txt
echo "saved"
fi
Но он не отображает "echo user exist"
. вместо этого он отображает так:
Enter user
abcdef
useradd: user 'abcdef' already exists
add password
New password:
В этом случае abcdef
является существующим пользователем
Пожалуйста, дайте мне знать, что здесь не так, большое спасибо.
Следующее условие в вашем скрипте:
if [ "$(id -u "$user" &>/dev/null)" = 1 ]; then
никогда не будет истинным. Было бы верно только , если бы вывод команды id -u "$ user" &> / dev / null
был бы одной цифрой 1, но как любой вывод этой команды перенаправляется в / dev / null
, этого никогда не произойдет.
Замените эту строку на
if { id -u "$user" &>/dev/null ; } then
Это условие проверяет статус выхода команды (а не ее вывод , например $ (...)
выполняет) и будет истинным, если команда id -u "$ user" &> / dev / null
завершится успешно (то есть пользователь существует), и будет ложным, если оно сбой (то есть пользователь не существует).
Ответ @raj на 100% верен для упрощения кода.
Это всего лишь несколько альтернативных способов использования кодов выхода, которые, возможно, проливают немного больше света на то, как их можно использовать.
Код выхода можно проверить, выполнив echo $?
сразу после вашей команды id -u $ user &> / dev / null
, что не обязательно заключенный в $ (..)
или что-нибудь в этом роде.
Просто попробуйте id -u <имя пользователя> &> / dev / null
, а затем введите echo $?
, чтобы проверить код выхода.
Пример:
terrance@terrance-ubuntu:~$ id -u terrance &>/dev/null
terrance@terrance-ubuntu:~$ echo $?
0
terrance@terrance-ubuntu:~$ id -u mark &>/dev/null
terrance@terrance-ubuntu:~$ echo $?
1
В приведенном выше примере пользователь отметка
не существует на моем компьютере, поэтому статус выхода равен 1.
Используя код выхода, вы можете поместить его в ] case
вместо оператора if..else
.
#!/bin/bash
echo "Enter username"
read -r user
id -u "$user" &>/dev/null
case $? in
0) echo "User exists";;
1) adduser $user
echo "add password"
passwd $user
echo $user >> text.txt
echo "saved";;
esac
Интересно, что использование if []; то
все еще можно использовать, добавив echo $?
в вашу проверку if, но я заметил, что вы проверяли, что 1 существует, но 1 означает, что код завершился с 1 значение не найдено.
Добавление будет работать так же.
#!/bin/bash
echo "Enter username"
read -r user
if [ $(id -u "$user" &>/dev/null; echo $?) == 0 ]; then
echo "User exists"
else
adduser $user
echo "add password"
passwd $user
echo $user >> text.txt
echo "saved"
fi