【问题标题】:Bash while loopBash while 循环
【发布时间】:2016-04-07 18:37:30
【问题描述】:

我正在尝试创建一个 while 循环。 这个循环应该在输入胡言乱语时回显“重试或输入退出退出”,或者在输入用户名时指认用户。

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

这是我到目前为止所拥有的一切。每当我在“重试或键入退出退出”后输入用户名时,它只会再次回显。我希望它指点用户而不是再次呼应它。我找了很多地方都找不到答案。

提前谢谢你。

【问题讨论】:

  • 你能分享你得到的输出吗?显示错误的行为?
  • 学习使用 shell 调试/跟踪功能并用set -vxset +vx 包围有问题的行以关闭。您将看到您的代码显示,然后执行。前面带有 + 的行显示了哪些值已替换为变量名。在调试模式下,所有引用都被调试/跟踪功能“归结”为单引号。您应该立即看到grep 后跟while 的问题。祝你好运!
  • 一旦我运行它并输入一个正确的用户,它就会指责用户。如果我输入胡言乱语,它会输出“再试一次或输入退出退出”,一旦我尝试输入正确的用户,它就会继续输出“再试一次或输入退出退出”。 username_loop.sh 请输入用户名进行查找。 jmalley2 登录名:jmalley2 姓名:Joseph Malley username_loop.sh 请输入用户名进行查找。 asdfasdfasfasf 再试一次或输入 exit 退出 jmalley2 再试一次或输入 exit 退出
  • JJM:最好通过包含测试来显示您的测试,并正确格式化到 Q 的正文中。使用编辑框左上方的{} 格式工具对突出显示的文本格式化为代码/数据/输出。再次祝你好运。
  • 你有 3 个循环。尝试使用 if 语句在一个循环中更改它。

标签: bash


【解决方案1】:

你可以试试这个:

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

【讨论】:

  • 您从一个在 /etc/passwd 中肯定找不到的名称开始。然后,直到您在 /etc/passwd (^:) 的第一个字段中找到输入的名称,您将继续询问新名称。如果你终于找到了一个名字,只需手指即可。
  • 您可以将read 放在while 中,这样您就不必从标记值开始。另外我猜finger 应该进入循环内部。
  • 循环用于查找有效的用户名,仅此而已。如果用户名是“q”,则完全退出。如果找到有效的用户名,则执行最终的“finger”语句,然后终止脚本。 read 已经在 while 中,并且手指不应该在那里,因为它不在原始请求中。
  • 嗯,不确定 OP 真正想要什么。原始脚本有一个无限循环,并且(相当可疑的)输入“退出”以停止的要求表明一个无限循环会影响越来越多的用户。仍然; while read -p "user? " user && ! grep "^$user:" /etc/passwd; do ... 恕我直言,会简化流程。
  • 是的,事情可以简化,但会牺牲一些可读性。如果您在dodone 之间输入[[ $u != q ]] || exit,您就完成了... :-)
【解决方案2】:
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

我想通了。我不得不在其中添加一个额外的功能。谢谢大家的帮助。

【讨论】:

    猜你喜欢
    • 2014-05-27
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 2020-08-19
    • 2014-01-21
    • 1970-01-01
    相关资源
    最近更新 更多