直到用户输入等于做某事 - 跟进

时间:2014-03-22 00:00:54

标签: shell variables input

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

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

当输入不存在的文件时,我得到一个"失控"循环直到我必须取消(CNTL + C)。示例:如果文件filesa存在,但用户" fat-fingers"它作为filessa

输入filename:filessa 找不到文件filessa!找不到文件filessa!找不到文件filessa!找不到文件filessa!找不到文件filessa!找不到文件filessa! ...........开启和开启。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

试试这个

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

答案 1 :(得分:1)

until中有一个bash循环:

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