【问题标题】:Until user input equals something do - Follow up直到用户输入等于某事做 - 跟进
【发布时间】:2014-03-22 12:07:17
【问题描述】:

跟进别人的题为“直到用户输入等于某事做”的问题。我的脚本要求用户输入文件名。该脚本必须搜索该文件。如果目录中不存在该文件,则必须再次提示用户输入文件名,直到他们输入存在的文件(必须持续到 true,不退出程序)。它看起来像吗?:

printf "Enter filename: "
read ifile
while [[ ! -e "$ifile" ]]
do
  printf "File $ifile not found! "
done

当输入一个不存在的文件时,我会得到一个“失控”循环,直到我必须取消 (CNTL + C)。示例:如果文件 filea 存在,但用户“胖手指”将其作为 filessa

输入文件名:filessa 找不到文件文件!找不到文件文件!找不到文件文件!找不到文件文件!找不到文件文件!找不到文件文件! ……………………………………………………………………………………………………………………………………………………………………………………………… ……

非常感谢任何帮助!

【问题讨论】:

    标签: shell variables input


    【解决方案1】:

    bash 中有一个until 循环:

    until [[ -e $ifile ]]; do
        [[ -z $ifile ]] || printf "File $ifile not found!\n"
        read -p "Enter filename: " ifile
    done
    

    实际上,until 也是 POSIX 标准的一部分,尽管符合 POSIX 标准的示例不太简洁:

    until [ -e "$ifile" ]; do
        [ -z "$ifile" ] || printf "File $ifile not found!\n"
        printf "Enter filename: "
        read ifile
    done
    

    【讨论】:

    • 直到循环运行良好!你能解释一下这部分吗:[ -z "$ifile" ] 非常感谢!
    • 它检查$ifile 的扩展是否为空字符串。 ifile 将在第一次通过循环时为空(从技术上讲,如果您不先将其初始化为其他内容,则取消设置)并且如果用户只是按 Enter 键而没有在提示后输入任何内容。
    【解决方案2】:

    试试这个

    printf "Enter filename: "
    read ifile
    while [[ ! -e "$ifile" ]]
    do
      printf "File $ifile not found! \n"
      printf "Enter filename: "
      read ifile
    done
    

    如果用户输入了错误的文件名,那么你必须让他们再试一次;-)。

    此外,如果用户没有输入任何内容,则会产生不同的错误。 我会把更扩展的检查写成

    printf "Enter filename: "
    read ifile
    while [[ ! -e "${ifile:-XXXXno_user_inputXXXX}" ]]
    do
      printf "File ${ifile:-XXXXno_user_inputXXXX} not found! \n"
      printf "Enter filename: "
      read ifile
    done
    

    var语法${var:-defaultValue}可以读作“如果变量$var为空,则打印:-后面的值作为替换值。

    XXXXno_user_inputXXXX 的迂腐反对意见是,您的目录中可能有一个文件已经命名为XXXX_no_user_inputXXXX,因此您必须确定这对您的项目是否有很大风险。

    IHTH

    【讨论】:

    • 谢谢!那成功了。此外,当我运行测试时用户不输入任何内容(Enter 键)或空白(空格,然后 Enter)而没有扩展检查,脚本的行为与输入的文件名不存在时相同。我看到了拥有 -defaultValue 的好处,只是很困惑为什么在我的测试中没有它运行时,空值被视为与不存在的文件相同。需要吗?
    • -e 测试文件是否存在。因此,对于该测试,拼写错误的文件名不存在,"" 也不存在。您可以将其视为一个很好的、简单的检查,它同时进行输入验证和文件存在检查。很高兴这有帮助。请接受该答案,然后最好地回答您的问题,并支持任何有助于您理解 shell 脚本的答案;-)。祝大家好运。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 1970-01-01
    • 2013-02-14
    • 2012-04-24
    相关资源
    最近更新 更多