【问题标题】:loop for file location until file exists in bash循环查找文件位置,直到文件存在于 bash
【发布时间】:2015-08-23 23:06:50
【问题描述】:

我已经创建了这个函数:

function promptFile()

{

while true;
    do
            read -p "Please provide a full path [q to quit]: " file
            if [ $file == q ]; then
                    echo "Exiting.."
                    return 1
            fi

            if [ ! -f $file ]; then
                    echo "File does not exist, please try again"

            else
                    echo $file
                    break
            fi
    done
}

要提示用户文件位置,再次询问文件是否不存在,如果存在则将输出保存到变量中,调用该函数:

tempLoc=$(promptFile)
if [ !tempLoc ]; then
        fileLocation=$tempLoc
fi

除非有人写了错误的文件位置,否则一切正常,然后在有人单击 q 或输入现有文件位置之前不会显示回显。 在这种情况下,将打印回显消息 * 错误输入的数量,如下所示。

[root@tsting:0]# ./tst
Please provide a full path [q to quit]: tst1
Please provide a full path [q to quit]: tst2
Please provide a full path [q to quit]: tst3
Please provide a full path [q to quit]: tst4
Please provide a full path [q to quit]: q
File does not exist File does not exist File does not exist File does not exist Exiting..
[root@tsting:0]#

我猜这是因为循环在发生时折叠回打印所有回声,有没有办法避免这种情况并在输入错误的文件位置时打印回声?

【问题讨论】:

  • 它肯定应该马上打印出来。如果你自己运行那个 sn-p 你还有同样的问题吗?
  • 嗯,它不是,我认为这与我调用函数的方式有关
  • 如果我自己运行一切正常:

标签: bash file loops while-loop echo


【解决方案1】:

将错误写入标准错误

echo "File does not exist, please try again" >&2

您将函数的所有输出保存到变量tempLoc,因此即使用户输入了一个有效文件,它也会在变量中包含大量垃圾。

不过,错误消息无论如何都应该发送到 Stderr,因此即使没有这个问题,最好将它们发送到那里。

【讨论】:

  • 非常感谢您的解释和帮助,建议的代码完美运行。
  • @Doubleg:你确定你测试过吗?包括辞职?您是否在文件名中使用空格对其进行了测试?
【解决方案2】:

这里有几件事:

您不需要带有“功能”的()(反之亦然)。 () 通常是首选,(Korn shell 除外)。

总是将错误消息写入标准错误:>&2,这是它不起作用的主要原因。有两种情况需要这样做。

与您的问题无关,但最好引用变量值,尤其是文件名:"$file"。这是为了以防有人在文件名中有空格。并不是说任何头脑正常的人都会命名带有嵌入空间的文件或目录(程序文件)。使用[[ ]] 而不是单括号会减少需求,但不会完全删除它。

始终将函数内的变量声明为local,除非您确实需要使用全局变量(通常不需要)。如果你不这样做,那么函数内部的变量可能会压倒外部的变量,特别是如果你在多个脚本中重用该函数。

调用函数后的if语句不正确。您正在测试真/假(它不会是)并且您省略了 $ 前缀。

promptFile()
{
    local file

    while true
    do
        read -p "Please provide a full path [q to quit]: " file
        if [ "$file" == q ]; then
            echo "Exiting.." >&2
            return 1
        fi

        if [ ! -f "$file" ]; then
            echo "File does not exist, please try again" >&2
        else
            echo "$file"
            break
        fi
    done
}

tempLoc=$(promptFile)
if [ -n "$tempLoc" ]; then
   fileLocation=$tempLoc
fi 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 2012-09-06
    相关资源
    最近更新 更多