无法只允许一个参数

无法只允许一个参数

我是 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

相关内容