我正在编写一个脚本来配置新的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 <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的此问题中获得了命令:检查用户是否存在
问题:
由于未引用变量扩展,因此$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
。
这与通常的问题相反,这些问题来自未引用变量的意外单词拆分。但是基本问题是相同的,并且由这里答案的一半来解决:总是引用变量扩展(除非您知道您想要未引用的行为)。
看:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句