id -u $ var дает тот же результат, если $ var имеет значение или нет

Я пишу скрипт для настройки новых установок Debian, находя лучшее решение для подтверждения того, что в скрипте существует пользователь, лучший способ, который я нашел, дает мне странный вывод.

ПРОБЛЕМА:

id -u $var и id -u $varsome дают одинаковый вывод, хотя var имеет значение (имя пользователя), а varsome не имеет значения

 [19:49:24][username] ~ ~↓↓$↓↓ var=`whoami` [19:53:38][username] ~ ~↓↓$↓↓ id -u $var 1000 [19:53:42][username] ~ ~↓↓$↓↓ echo $? 0 [19:53:49][username] ~ ~↓↓$↓↓ id -u $varsome 1000 [19:09:56][username] ~ ~↓↓$↓↓ echo $? 0 [20:10:18][username] ~ ~↓↓$↓↓ bash --version GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu) Copyright (C) 2016 Free Software Foundation, Inc. Licens GPLv3+: GNU GPL version 3 eller senere  This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. [20:27:08][username] ~ ~↓↓$↓↓ cat /etc/os-release PRETTY_NAME="Debian GNU/Linux 9 (stretch)" NAME="Debian GNU/Linux" VERSION_ID="9" VERSION="9 (stretch)" ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/" 

Я получил команду из этого вопроса на stackoverflow: Проверьте, существует ли пользователь

ВОПРОСЫ:

  • Что здесь происходит?
  • Есть ли лучший способ проверить, существует ли пользователь в сценарии?
  • Указатели на сценарий хорошо оценены

Поскольку расширение переменной не заключено в кавычки, пустое слово, которое возникает в результате расширения $varsome , удаляется полностью.

Давайте создадим функцию, которая печатает количество получаемых аргументов, и сравним кавычки и кавычки:

 $ args() { echo "got $# arguments"; } $ var="" $ args $var got 0 arguments $ args "$var" got 1 arguments 

То же самое происходит в вашем случае с id : id -u $var точно так же, как просто id -u когда var пуст. Поскольку id не видит имя пользователя, по умолчанию он печатает информацию о текущем пользователе.

Если вы цитируете "$var" , результат будет другим:

 $ var="" $ id -u "$var" id: '': no such user 

Исправив это, вы можете использовать id чтобы найти, существует ли пользователь. (Нам здесь не нужны выходные данные, поэтому перенаправьте их прочь.)

 check_user() { if id -u "$1" >/dev/null 2>&1; then echo "user '$1' exists" else echo "user '$1' does not exist" fi } check_user root check_user asdfghjkl 

Это напечатало бы user 'root' exists а user 'asdfghjkl' does not exist .


Это немного наоборот обычных проблем, возникающих из-за неожиданного разбиения слов в кавычках. Но основная проблема та же и устраняется тем, что половина ответов здесь говорит: всегда заключайте в кавычки расширения переменных (если вы не знаете, что хотите использовать поведение без кавычек).

Увидеть:

  • Когда необходимо двойное цитирование?
  • Почему мой сценарий оболочки заглушает пробелы или другие специальные символы?
  • BashGuide по разделению слов

Команда id -u даст вам идентификатор текущего пользователя. Команда id -u user даст вам идентификатор этого пользователя.

Теперь в вашем примере вы используете

 var=`whoami` id -u $var 

Команда whoami возвращает текущего пользователя. Таким образом, id -u current_user будет возвращать идентификатор текущего пользователя, а id -u также будет возвращать идентификатор текущего пользователя.

редактировать

Обратите внимание, что обратные галочки не рекомендуется, и вместо них рекомендуется писать $(whoami) , например:

 var=$(whoami) id -u $var