所以我想要两个文件,如果一个文件不存在请求另一个文件存在,这就是我试图这样做的方式。但是真的没有用,也许我对它需要做的事情做了一点点努力?
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
答案 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
下面,您要设置count1
和count2
个变量。你的意思是在循环中使用它们吗?或者你只是在这里重新使用他们的名字?
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)