如果 $var 有值或没有值,id -u $var 给出相同的输出

如果 $var 有值或没有值,id -u $var 给出相同的输出

我正在编写一个脚本来配置新的 debian 安装,同时找到确认脚本中存在用户的最佳解决方案,我发现的最佳方法给了我奇怪的输出。

问题:

id -u $varid -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 <http://gnu.org/licenses/gpl.html>

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 上的这个问题得到了命令:检查用户是否存在

问题:

  • 这里发生了什么?
  • 您是否可以找到更好的方法来验证脚本中的用户是否存在?
  • 非常感谢有关脚本的指针

答案1

由于变量扩展没有被引用,因此扩展产生的空字$varsome被完全删除。

让我们创建一个函数来打印它获取的参数数量,并比较带引号和不带引号的情况:

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

同样的情况也发生在你的情况下id:与空时id -u $var完全相同。由于看不到用户名,因此默认情况下会打印当前用户的信息。id -uvarid

如果你引用"$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' existsuser 'asdfghjkl' does not exist


这与常见问题有点相反,这些问题是由于未加引号的变量的意外分词而引起的。但基本问题是相同的,并且由这里一半的答案所说的解决:始终引用变量扩展(除非您知道您想要未引用的行为)。

看:

答案2

该命令id -u将为您提供当前用户的 ID。该命令id -u user将为您提供该用户的 ID。

现在在您的示例中,您使用

var=`whoami`
id -u $var

该命令whoami返回当前用户。所以id -u current_user会返回当前用户的id,也会id -u返回当前用户的id。

编辑

请注意,不推荐使用反引号,建议$(whoami)改为这样写,例如:

var=$(whoami)
id -u $var

相关内容