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