Добавить & ldquo; not & rdquo; если заявление в сценарии оболочки

У меня есть следующий скрипт, который должен существовать, если пользователь не существует.

#check if user currently exists on system
if id $User > /dev/null 2>&1
then
    #user exists no need to exit program
    echo "blah blah, what a waste of space"
else
    echo "This user does NOT exists.  Please create that user before using this script.\n"
    exit
fi

Моя проблема в том, что в идеале я хотел бы поместить «не», если это первое утверждение if, чтобы я мог урезать свое выражение if, else. В идеале я хотел бы что-то вроде этого:

if !(id $User > /dev/null 2>&1)
then
    echo "This user does NOT exists.  Please create that user before using this script.\n"
    exit
fi
4
задан 4 January 2014 в 19:10

3 ответа

«Не» пишется !, без пунктуации и пробела после него.

if ! id "$user_name" > /dev/null 2>&1
then
    echo 1>&2 "This user does NOT exists.  Please create that user before using this script.\n"
    exit 1
fi

Ваше предложение на самом деле сработает, но скобки создают подоболочку для запуска одной команды id, что является излишним.

Другие изменения:

  • Всегда ставьте двойные кавычки вокруг переменных: "$user_name"
  • Уже существует переменная USER, которая является именем текущего в пользователя. Имена переменных чувствительны к регистру, но людей не так много.
  • Вернуть значение от 1 до 125, чтобы указать на сбой в программе.
  • Сообщать об ошибках к стандартной ошибке (дескриптор файла 2), а не к стандартному выводу.
0
ответ дан 4 January 2014 в 19:10

В сценариях оболочки есть оператор , а не , и это !, но вы используете его не совсем корректно.

Поставьте пробел между оператором ! и его операндом и оставьте скобки. Это должно работать для всех оболочек в стиле POSIX , включая bash и sh / dash.

if ! id $User > /dev/null 2>&1
then
    echo "This user does NOT exists.  Please create that user before using this script.\n"
    exit
fi

Вы можете использовать скобки для группировки, если хотите, хотя в этом случае это не нужно. Создается новый подоболочек для выполнения выражения в скобках. Оператор ! должен все еще иметь пробел между ним и символом (. (Пробелы вокруг скобок необязательны.)

if ! (id $User > /dev/null 2>&1)
then
    echo "This user does NOT exists.  Please create that user before using this script.\n"
    exit
fi

См. Прекрасный ответ Жиля , для некоторых хороших альтернатив и стилевых рекомендаций. (Также, спасибо Жилю за некоторые исправления относительно использования скобок.)

0
ответ дан 4 January 2014 в 19:10

На вопросы как этот отвечают в "Усовершенствованном Руководстве по созданию сценариев Bash"
- который видим и доступен для скачивания по http://www.tldp.org/guides.html

0
ответ дан 4 January 2014 в 19:10

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

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