询问文件是否已存在且有错误

时间:2018-01-12 09:59:59

标签: bash

所以我想要两个文件,如果一个文件不存在请求另一个文件存在,这就是我试图这样做的方式。但是真的没有用,也许我对它需要做的事情做了一点点努力?

echo wich two files u want?
read file1
read file2

touch error1
touch error2

while [ count1 > 0 ]
echo the file doesn't exists give another one
read file1

while [ count2 > 0 ]
echo the file doesn't exist give another one
read file2

$file1 2> error1
$file2 2> error2

count1=wc<error1
count2=wc<error2

2 个答案:

答案 0 :(得分:2)

在将代码提交到stackoverflow之前,最好让shellcheck.net或类似的代码检查您的代码。您提交的代码没有意义,虽然Toby的代码可能是解决方案,但是通过代码可能是值得的。

echo which two files u want? read file1 read file2

这回应:

which two files u want? read file1 read file2

它不读取变量。如果你想这样做,你应该做到:

echo "which two files u want?"
read file1 
read file2

触摸错误文件是否是一个好主意是一个选择问题;一般来说,我不会这样做。

while [ count1 > 0 ]
echo the file doesn't exists give another one
read file1

这不是正确的bash。有两件事只是语法错误,应该由你自己解决。

bash中的while循环使用do - done来标记while循环中块的开头和结尾。他们不在这里。对shellcheck.net的简单检查会显示

SC1073: Couldn't parse this while loop.

下一个问题是带引号的问题。如果您打开(单个)报价,则必须将其关闭。这里最好的方法是在它们周围加上双引号。所以,甚至不看语义,它将是:

while [ count1 > 0 ] ; do
    echo "the file doesn't exists give another one"
    read file1
done

然后在while循环中存在你的病情问题。字符串count1大于0。所以while循环将永远执行,问你另一个文件。如果您打算使用变量count1,则在bash中您需要使用$ - 符号取消引用它,如

while [ $count1 > 0 ] ; do

但您可能想在某处设置该变量。 (我没有进入有关引用的讨论)。这里,&gt;不测试数值大于;您需要进行数字比较,-gt

如果我理解您正确需要的功能,您想知道file1是否是现有文件。所以你真正想要的是

while [ ! -f "$file1" ] ; do

(同样适用于您的file2 - 阻止) 请注意,我在$file1周围加上了引号。这是因为文件名可能包含空格。这样就可以了:

"$file1" 2> error1
"$file2" 2> error2

下面,您要设置count1count2个变量。你的意思是在循环中使用它们吗?或者你只是在这里重新使用他们的名字?

count1=wc<error1
count2=wc<error2

wc也带有文件名参数,因此您不需要重定向stdin。但是,您必须使用bash中的语法来使用wc的输出。那就是:

count1=$(wc error1)

我试图尽可能保持礼貌和教育,但请至少在shell编程方面做出一些认真的努力,而不是对伪代码进行一些麻烦的尝试。

答案 1 :(得分:1)

我不太确定你要做什么,但听起来你想要反复询问一个文件名,直到你得到一个文件名。我会为此写一个函数:

#!/bin/bash

get_existing_file() {
    read -r -p "Filename: " f
    until test -e "$f"
    do
        read -r -p "$f not found; new filename: " f
    done
    echo "$f"
}

然后您可以像这样使用它:

file1=$(get_existing_file)
file2=$(get_existing_file)