kumaxim
@kumaxim
Web-программист

Почему выполнение скрипта всегда идет по ветке ELSE?

Доброго времени суток коллеги.
Имею следующий код в bash-скрипте:
#!/bin/bash
set -e
if [ -n "$(cat /etc/passwd | cut -d: -f1 | grep -q "$CUSTOM_USER")" ]; then
    echo "FATAL ERROR: user \"$CUSTOM_USER\" already exist"
    exit 1
else
    USER_CREATE_CMD="$CUSTOM_USER"
fi

Вся проблема в первой линии. Передаю я существующего или не существующего пользователя - обработка идет по ветке else в любом случае.

Логика того что нужно сделать простая - если юзер с таким именем уже есть в системе, тогда выдать ошибку. Если нет - записать его имя переменную, которая будет использоваться далее по коду.

Я с bash-скриптами пересекаюсь не часто, поэтому можете объяснить почему так происходит? Что я упускаю из виду?

UPD:
Вариант без кавычек выдает точно такое же поведение
if [ -n $(cat /etc/passwd | cut -d: -f1 | grep -q "$CUSTOM_USER") ]; then
  • Вопрос задан
  • 326 просмотров
Пригласить эксперта
Ответы на вопрос 6
@Aves
grep -q всегда пустая строка, [ -n '' ]всегда будет false
Если нужно проверить exit code, можно сделать
if cat /etc/passwd | cut -d: -f1 | grep -q "$CUSTOM_USER"; then

Вообще grep не очень подходит для определения наличия пользователя, лучше сделать if id $CUSTOM_USER &>/dev/null; then
Ответ написан
Комментировать
@azazelpw
Linux SA
#!/bin/bash
while IFS=":" read LOGIN_NAME LOGIN_PASSWD LOGIN_UID LOGIN_GID LOGIN_DESC LOGIN_HOME LOGIN_SHELL ;
do
echo $LOGIN_NAME
if [[ $LOGIN_NAME = $CUSTOM_USER ]]
then
echo "FATAL ERROR: user \"$CUSTOM_USER\" already exist"
else
 USER_CREATE_CMD="$CUSTOM_USER"
fi
done < /etc/passwd
Ответ написан
Комментировать
@alegzz
а почему должно быть не false?
if [[ -n `id $CUSTOM_USER 2>/dev/null` ]]; then
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
man grep говорит:
-q: Quiet; do not write anything to standard output.

А строчка if [ -n "$(cat /etc/passwd | cut -d: -f1 | grep -q "$CUSTOM_USER")" ]; как раз проверяет, что на выводе что-то есть.
Проверяйте код завершения grep, либо замените всю эту байду на getent passwd "$CUSTOM_USER" и проверяйте его код завершения.
Ответ написан
Комментировать
@abcd0x00
Программы возвращают код завершения (код возврата). Если grep нашла текст, она выводит найденный текст и возвращает успешный код завершения (ноль). Если grep не нашла текст, она не выводит ничего и возвращает провальный код завершения (единицу). Вот опция -q отключает только выводимый текст, а код завершения как возвращался, так и возвращается. В shell'е конструкция $() имеет дело только с выводимым текстом и не знает про код возврата. Поэтому для неё найденный и ненайденный тексты выглядят одинаково - в виде пустоты.
Ответ написан
Комментировать
@Kevin1
Добрый день,
В shell/bash очень часто строки проверяют так: if [ "x" != "x$some_var" ]; then ...
таким образом исключается сравнение с пустой строкой.
Попробуй записать условие как:
if [ "x" != "x$(cat /etc/passwd | cut -d: -f1 | grep -q "$CUSTOM_USER")" ];
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы