我是 Bash 脚本编写的初学者,我的脚本运行不正常。我不知道如何修复它或编码它的正确方法。用户应该只能输入一个参数。 ( $ nowOn f132a99
) 如果输入多个参数,则会提示“Please enter a single, valid user id: "
我不确定如何解决此问题”。
$ nowOn f132a99 = 正确的输出
$ nowOn f132a99 f132a98 = 第 1 行二进制运算符预期错误
$ nowOn f132a99 f132a98 f132a97 = 第 1 行错误太多参数
if [ -z "$@" ]; then
echo -n "Please enter a single, valid user id: "
read userid
else
userid="$@"
fi
#user validation check
if ! grep -q "$userid" /etc/passwd >/dev/null 2>&1;then
echo
echo "The user you entered, $userid is not a valid user on this system."
exit 2
else
#login check
if ! who | grep "$userid" >/dev/null 2>&1;then
echo
echo `grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'` is NOT currently logged on
exit 1
else
#login check
echo
echo `grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'` is currently logged on.
exit 0
fi
fi
我还尝试了下面的代码,但如果您输入多个参数 ( nowOn f132a99 f132a97
) 那么它将只显示 f132a99 的结果并忽略其余部分,而不是 echoPlease enter a single, valid user id:
if [ -z "$1" ]; then
echo -n "Please enter a single, valid user id: "
read userid
else
userid="$1"
fi
答案1
是的,您的测试[ -z "$@" ]
没有按照您的预期进行。将"$@"
扩展为引用的每个单独的命令行参数,这为您提供了一个基本上类似于[ -z "f132a99" "f132a98" "f132a97" ]
三个参数的测试。
如果您希望用户只给出一个参数,您应该做的正是您提到的在你自己的回答中,即使用类似的测试[ "$#" -ne 1 ]
来测试无效输入。
然而,还有另一种选择,那就是考虑全部将给定参数作为用户 ID,并循环它们:
if [ "$#" -eq 0 ]; then
echo 'No user ID given' >&2
exit 1
fi
for userid do
# code to process "$userid" goes here
done
关于您的代码的其他注释:
对有效用户 ID 的测试存在缺陷。考虑一个没有用户调用的系统bill
,但是有是A billy
。作为用户 ID输入bill
不会将其检测为无效用户 ID (如果字符串以破折号开头,则grep -q "$userid" /etc/passwd
此命令也可能会生成错误)。$userid
最好使用 进行测试getent -- passwd "$userid"
,并执行passwd
与从数据库中获取数据相关的所有操作getent passwd
。
您也有类似的问题who | grep "$userid"
,最好写成who | grep -q "^$userid\>"
。
我提到了这些事情在我对你之前问题的回答中。
答案2
使用以下方法解决了它:
if [ $# -ne 1 ]; then
echo -n "Please enter a single, valid user id: "
read userid
else
userid="$1"
fi