Shell script продолжает выполняться, даже если он был истинным

У меня есть простой 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 является существующим пользователем

Пожалуйста, дайте мне знать, что здесь не так, большое спасибо.

3
задан 31 August 2021 в 17:41

2 ответа

Следующее условие в вашем скрипте:

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 завершится успешно (то есть пользователь существует), и будет ложным, если оно сбой (то есть пользователь не существует).

9
ответ дан 4 September 2021 в 09:27

Ответ @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
2
ответ дан 4 September 2021 в 09:27

Другие вопросы по тегам:

Похожие вопросы: