Linux shell getopts问题

loveyou_1108 2008-05-28 11:45:08
我是在看一本Unix.shell编程(第三版)中书中一个例子时发现问题的,源代码如下:
描述:
这个例子很简单,大意是看某个用户是否已经登陆.执行些程序里后面跟参数,如 ./run -m -t 30 root
-m 就是是否要把显示信息发送到邮箱去,如果不加-m就直接显示在标准输出
-t 呢就是设定多长时间去检查些用户是否已经登陆.
问题:
1.执行此程序时在case里把option赋值给了interval 但我通过打出而是把t这个字母赋值给了它,而不是30这个数字?
2.$OPTIND这个参数的变化是根据什么?
3.此程序执行时,如果监听的用户已经登陆则正常,如果没有登陆则错误,我知道这与interval这个赋值有关系, 请问怎样才能把30赋给interval而不是t呢?
谢谢!!!
mailopt=FALSE
interval=60
#process command options
while getopts mt: option
do
case "$option"
in
m)mailopt=TRUE;;
t)interval=$option;;
\?)echo "Usage: mon [-m] [-t n] user"
echo "-m means to be informed by mail"
echo "-t means check every n seconds"
exit 1;;
esac
done
#make sure a user name was specified
echo $OPTIND
echo $#
if [ "$OPTIND" -gt "$#" ]
then
echo "Missing user name!"
exit 2
fi

shiftcount=$((OPTIND - 1))
shift $shiftcount
user=$1


#
#Check for user logging on
#
until who | grep "^$user " > /dev/null
do
sleep "$interval"
done

#
#When we reach this point, the user has logged on

if [ "$mailopt" = FALSE ]
then
echo "$user has logged on"
else
runner=$(who am i | sed 's/ .*//')
echo "$user has logged on" | mail $runner
fi
...全文
377 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
loveyou_1108 2008-05-28
  • 打赏
  • 举报
回复
问题已经解决!是因为-t 后面的参数是赋给了一个特殊变量OPTARG只要在case里面把interval=$OPTARG即可
可现在还有一点不明白
shiftcount=$((OPTIND - 1))
shift $shiftcount
user=$1
这步不明白是什么用意?我注释了后运行结果是一样,而且在程序中也没有调用shiftcount.不知道作者是怎么想的
loveyou_1108 2008-05-28
  • 打赏
  • 举报
回复
如果我现在还需要在这个程序添加一个参数-f 而-f后面也需要跟参数.那现在应该怎么才能取得f后面的参数值呢?
$OPTARG我试过了不能取得.这个getopts还有这种功能吗?谢谢
cceczjxy 2008-05-28
  • 打赏
  • 举报
回复
shiftcount=$((OPTIND - 1))
取参数个数
shift $shiftcount
移动参数位置
user=$1
经过移动后,$1变为最后一个参数,即user取最后一个参数的值



23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧