我正在编写一个 bash 脚本,它将
- 将网站的 html 代码下载到文件“index.html”中
- 询问用户文件类型并搜索“index.html”以获取匹配的文件类型数量
这是完成步骤 2 的函数:
1. function findFiles() {
2. echo "Enter file type to search for (include '.') || Type EXIT to terminate program "
3. read fileType
4.
5. while [[ "$fileType" != "EXIT" ]];
6. do
7. if [[ $(grep -q $fileType index.html) = 1 ]]; then
8. grep -F "$fileType" index.html >> foundFiles.txt
9. fi
10. done
11.
12. rm index.html
13. };
执行时,第 3 行提示用户输入,但是当我按回车键时没有响应,示例如下:
2021-09-26 12:41:06 (2.66 MB/s) - ‘index.html’ saved [94126]
Enter file type to search for (include '.') || Type EXIT to terminate program
.pdf
.txt
foo
AAAA
我尝试过$fileType
先声明一个局部变量,read -p
然后在第 3 行末尾使用分号。结果总是一样,我找不到解决方案。我知道第 3 行后面的内容有缺陷,但我只想得到有关第 3 行的帮助,因为接下来的几行是我想自己研究的内容,以便更多地了解 bash 脚本。
任何想法都值得赞赏。
答案1
它不应该做出反应。它正在做它应该做的事情:它读取输入并将其分配给变量fileType
。但是,你有一个while
循环正在检查一个永远不会改变的变量的值:
while [[ "$fileType" != "EXIT" ]];
由于 的值$fileType
只设置了一次,而且是在while
循环之前,因此除非您第一次尝试while
就通过,否则它将变成无限循环。无论如何,您的脚本无论如何都无法工作,因为 的输出永远不会是。事实上,它将始终为空,因为 就是那样。我怀疑您是想检查命令的退出状态,但即使这样也是毫无意义的:用 读取整个文件一次,然后再用 重新读取一遍,这没有任何好处。EXIT
grep -q pattern file
1
grep -q
grep -q
grep -F
这是您的函数的工作版本:
function findFiles() {
while [[ "$fileType" != "EXIT" ]];
do
echo "Enter file type to search for (include '.') || Type EXIT to terminate program "
read fileType
grep -F "$fileType" index.html >> foundFiles.txt
done
rm index.html
};
或者,如果您想避免foundFiles.txt
在没有找到匹配项时创建一个空的,您可以尝试:
function findFiles() {
while [[ "$fileType" != "EXIT" ]];
do
echo "Enter file type to search for (include '.') || Type EXIT to terminate program "
read fileType
if grep -qm1 "$fileType" index.html; then
grep -F "$fileType" index.html >> foundFiles.txt
fi
done
rm index.html
};
确保在第一次匹配后-m
退出grep
,因此您无需读取整个文件两次。请注意,我没有使用命令替换 ( $(command)
) 语法,因为我正在检查命令是否成功,而不是尝试使用它的输出。
答案2
您似乎陷入了无限循环。如果用户没有输入“EXIT”,那么循环while
将永远持续下去。您输入的任何其他文本都只会回显到终端。