循环文件位置,直到文件在bash中存在



我已经创建了这个函数:

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]#

我猜这种情况的发生是因为循环在打印所有echo时崩溃,是否有一种方法可以避免这种情况,并且在输入错误的文件位置时仅打印echo ?

将错误写入stderr

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

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

Stderr是错误消息应该去的地方,所以即使没有这个问题,也应该把它们发送到那里。

这里有几点:

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

总是写错误消息stderr: >&2,这是它不工作的主要原因。有两个实例需要这样做。

与您的问题无关,但引用变量值是一个好主意,特别是文件名:"$file"。这是以防有人在文件名中有空格。并不是任何一个头脑正常的人都会用嵌入空间(程序文件)来命名一个文件或目录。使用[[ ]]而不是单括号可以减少这种需要,但并不能完全消除它。

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

调用函数后if语句错误。您正在测试true/false(它不会是),并且您省略了$前缀。

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 

相关内容

  • 没有找到相关文章

最新更新