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事实上,我会编辑帖子来解决这些问题。