Bash 脚本:“读取”命令无响应

Bash 脚本:“读取”命令无响应

我正在编写一个 bash 脚本,它将

  1. 将网站的 html 代码下载到文件“index.html”中
  2. 询问用户文件类型并搜索“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就通过,否则它将变成无限循环。无论如何,您的脚本无论如何都无法工作,因为 的输出永远不会是。事实上,它将始终为空,因为 就是那样。我怀疑您是想检查命令的退出状态,但即使这样也是毫无意义的:用 读取整个文件一次,然后再用 重新读取一遍,这没有任何好处。EXITgrep -q pattern file1grep -qgrep -qgrep -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将永远持续下去。您输入的任何其他文本都只会回显到终端。

相关内容