Bash getopts,参数未传递给选项

Bash getopts,参数未传递给选项,bash,getopts,Bash,Getopts,我有以下脚本 应该是这样工作的: bash code.sh -u user -g 它应该返回已输入用户的组,但它会返回正在执行脚本的用户的组 #!/bin/bash while getopts u:fgd options; do case $options in u) user = $OPTARG 2>/dev/null; if grep -q $OPTARG /etc/passwd == 1 2>/dev/null ; then

我有以下脚本 应该是这样工作的:

bash code.sh -u user -g
它应该返回已输入用户的组,但它会返回正在执行脚本的用户的组

    #!/bin/bash

while getopts u:fgd options; do
    case $options in
    u)
    user = $OPTARG 2>/dev/null;
    if grep -q $OPTARG /etc/passwd == 1 2>/dev/null ; 
    then
      echo "user exists";

    else
      echo "user doesnt exist"
    fi 
    ;;
    g) if $user;
    then    
        echo $user;
        echo "the groups of the user are: ";
        groups $user ;
    else
        echo "user missing"
    fi 
    ;;
    f) echo "output f" ;;

    d) echo "output d" ;;


    esac

done

基本上在g)中,如果有一个输入的用户,该用户没有被捕获为参数,则该选项应该有效

#/bin/bash
而getopts u:烟气脱硫选项;做
案例$options
(u)
user=$OPTARG 2>/dev/null;#赋值周围没有空格,未设置
#即使成功了,你仍然有问题
#始终设置用户,即使用户未设置
#存在,但要测试变量是否为
#稍后设置,您应该将其移动到if中
如果grep-q$OPTARG/etc/passwd==12>/dev/null;#你的测试不起作用,
#if测试返回值
#直接执行命令,而不是
#使用“==1”
#此外,这种grep模式将
#匹配多个用户
#此外,返回代码为1(或任何非零值)表示失败
然后
回显“用户存在”;
其他的
回显“用户不存在”
fi
;;
g) 如果$user;#在这里,您想检查是否设置了user,但是bash
#将尝试运行用户的内容并测试返回
#价值观。因为上面没有设置用户,所以它将是空的,并且
#不返回任何错误。之后,将调用命令组
#并返回您自己的组。
然后
echo$user;
echo“用户组为:”;
组$用户;
其他的
回显“用户丢失”
fi
;;
f) 回波“输出f”;;
d) 回波“输出d”;;
以撒
完成
下面的一个执行您希望它执行的操作:

#/bin/bash
set-euo pipefail#这就是所谓的bash严格模式
#如果有错误,它将使bash退出
#命令返回非零,即使在管道中或
#变量未定义
user=”“#将变量定义为空
而getopts u:烟气脱硫选项;做
中的“$options”案例
(u)
如果grep-q“^$OPTARG:”/etc/passwd;然后#记下“^”以确保
#字符串从开头开始
#排队
user=“$OPTARG”#存储该值,否则保持为空
回显“用户存在”
其他的
回显“用户不存在”
fi
;;
(g)
如果[-n“$user”];然后#检查字符串长度是否为非零
回显“$user”
echo“用户的组是:”
组“$user”
其他的
回显“用户丢失”
fi
;;
f) 回波“输出f”;;
d) 回波“输出d”;;
*)echo“错误,无效选项$options”;#处理默认情况
以撒
完成

我还强烈建议您通过
bash-x
查看您的代码,它会在运行时打印出每个命令。

2>/dev/null
使错误消失时,是因为它隐藏了错误消息,而不是因为它使代码正常运行。有几个语法错误。我建议搜索/etc/passwd以查找
“^$OPTARG:”
——冒号将强制它匹配整个用户字段,而不仅仅是前缀。另外,请删除行尾不必要的分号(尽管
case
条目末尾需要双分号)。@GordonDavisson事实上,我会编辑帖子来解决这些问题。