Bash-while循环

Bash-while循环,bash,Bash,我正在试着做一个while循环。 当输入gibberish时,此循环应回显“重试或键入exit退出”,如果输入用户名,则应指向用户 echo Please enter a user name to find. read username done_fn() { finger $username exit 0 } continue_fn() { echo 'try again or type exit to quit' read exitvar } grep $user

我正在试着做一个while循环。 当输入gibberish时,此循环应回显“重试或键入exit退出”,如果输入用户名,则应指向用户

echo Please enter a user name to find.
read username
done_fn()
{
  finger $username
  exit 0 
}    
continue_fn()
{
  echo 'try again or type exit to quit'
  read exitvar
}

grep $username /etc/passwd >/dev/null
while [ $? -eq 0 ]
do
  done_fn
done

exitvar=quit

until [ $exitvar = exit ]
do
  continue_fn
  done
while [ -u $exitvar ]
do
  done_fn
done
这是我到目前为止所得到的一切。每当我在“重试或键入exit退出”后键入用户名时,它将再次回显。我希望它指向用户,而不是重复它。我找了这么多地方都找不到答案

提前感谢您。

您可以尝试以下方法:

typeset u="John Doe"
while ! grep -q "^$u:" /etc/passwd
do
    echo -n "username? "
    read u
    if [[ $u = "q" ]]
    then
            exit
    fi
done
finger $u

我想出来了。我必须在里面加一个额外的功能。谢谢您的帮助。

您能分享您得到的输出吗?要显示错误的行为,请学习使用shell调试/跟踪功能,并使用
set-vx
set+vx
将有问题的行包围以关闭。您将看到代码显示,然后执行。前面带+的行显示变量名替换了哪些值。在调试模式下,调试/跟踪功能将所有引用“分解”为单个引用。您应该立即看到
grep
的问题所在,然后是
while
。祝你好运一旦我运行它并输入正确的用户,它就会指向用户。如果我输入胡言乱语,它会输出“重试或键入退出退出”,一旦我尝试输入正确的用户,它会继续输出“重试或键入退出退出”。username_loop.sh请输入要查找的用户名。jmaley2登录名:jmaley2名称:Joseph Malley username_loop.sh请输入要查找的用户名。asdfasdfasfasf重试或键入exit退出jmaley2重试或键入exit退出jjjm:最好将测试包含在Q的正文中,并正确格式化。使用高亮显示文本编辑框左上角的
{}
格式化工具将其格式化为代码/数据/输出。再次祝你好运。你有3个循环。尝试使用if-statement在一个循环中对其进行更改。您以一个在/etc/passwd中肯定找不到的名称开始。然后,在/etc/passwd(^:)的第一个字段中找到输入的名称之前,您将继续询问新名称。如果您最终找到了一个名称,只需用手指触摸它。您可以在
while
中输入
read
,这样您就不必从sentinel值开始。另外,我猜
手指
应该进入循环内部。循环用于查找有效用户名,仅此而已。如果用户名为'q',则完全退出。如果找到有效的用户名,请执行最后的“finger”语句,然后终止脚本。读取的
已经在
中,而
中不应该有手指,因为原始请求中没有手指。嗯,不确定OP真正想要什么。最初的脚本有一个无休止的循环,输入“quit”停止的要求(相当可疑)意味着一个无休止的循环,指向越来越多的用户。仍然<代码>读取时-p“用户?”用户&&!grep“^$user:”/etc/passwd;执行
。。。可以简化流程。是的,事情可以简化,但要牺牲一些可读性。如果在
do
done
之间输入
[[$u!=q]]]|
退出
echo Please enter a user name to find.
read username
donev2_fn()
{
        finger $exitvar
        exit 0
}
done_fn()
{
        finger $username
        exit 0
}
continue_fn()
{
        echo 'try again or type exit to quit'
        read exitvar
        grep $exitvar /etc/passwd >/dev/null
        if [ $? -eq 0 ]
                then
                        donev2_fn
        fi
}
grep $username /etc/passwd >/dev/null
while [ $? -eq 0 ]
        do
                done_fn
done
exitvar=quit
until [ $exitvar = exit ]
        do
                continue_fn
done