2

我正在尝试读取包含以下内容的文本文件sport.txt,并尝试将用户输入与在文本文件中找到的运动名称相匹配。

如果找到它将打印“找到运动”,如果没有找到它将打印“未找到运动”。

显示的第一个示例看起来几乎完美,直到我尝试输入一个随机单词并显示错误:

[:==:应为一元运算符

我也尝试""在显示的第二个示例中使用 for 变量,但它只会打印“未找到运动”,即使我键入了与文本文件中的运动名称完全匹配的运动名称。

文件运动.txt

cycling
swimming
batmintion

代码(示例 1)

#!/bin/bash
file="sports.txt"
read -p "Enter a sports name": sportsName
existingSports=$(grep $sportsName $file);
if [ $existingSports == $sportsName ]; then
     echo "Sports Found"
else
     echo "No Sports Found"
fi

如果我根据上述代码键入“游泳”,则输出为:

运动发现

现在如果我输入“游泳”,输出是:

找不到运动

如果我输入一个随机单词'asd',输出是:

[: ==: 一元运算符预期
没有找到运动

代码(示例 2)

#!/bin/bash
file="sports.txt"
read -p "Enter a sports name": sportsName
existingSports=$(grep $sportsName $file);
if [ "$existingSports" == "$sportsName" ]; then
     echo "Sports Found"
else
     echo "No Sports Found"
fi

如果我根据上述代码输入“游泳”,则输出为:

找不到运动

现在如果我输入“游泳”,输出是:

找不到运动

代码(示例 3)

#!/bin/bash
file="sports.txt"
read -p "Enter a sports name": sportsName
existingSports=$(grep $sportsName $file);
if [[ "$existingSports" == "$sportsName" ]]; then
     echo "Sports Found"
else
     echo "No Sports Found"
fi

如果我根据上述代码键入“游泳”,则输出为:

找不到运动

现在如果我输入“游泳”,输出是:

找不到运动

如前所述,第一个示例几乎接近预期。我应该怎么做才能摆脱错误消息?

4

2 回答 2

2

而不是这个块:

existingSports=$(grep $sportsName $file);
if [ $existingSports == $sportsName ]; then
     echo "Sports Found"
else 
     echo "No Sports Found"
fi

您可以使用grep -q单词边界并将代码减少到单行:

grep -q "\<$sportsName\>" "$file" && echo "Sports Found" || echo "No Sports Found"

根据man grep

-q, --quiet, --silent

Quiet; do not write anything to standard output. Exit immediately with zero status if any match is found, even if an error was detected.

于 2013-10-28T09:13:45.920 回答
2

尝试以我的方式进行:

 #!/bin/bash
 file="sports.txt"
 read -p "Enter a sports name": sportsName
 sportsName=`echo $sportsName | sed -e 's/^ *//g' -e 's/ *$//g'`
 # The above sed command will remove all trailing and leading spaces which user can give as input
 result=`grep -c $sportsName $file`;
 if [ $result -eq 0 ]
 then
     echo "Sorry No match found"
 else

     echo "$result matches found"
 fi

grep 中的 "-c" 将计算出现次数,如果出现次数不为 0,则显示else循环中的出现次数。

记住在 grep 命令上使用“`”波浪号

如果您正在寻找确切的单词而不是其他单词的子字符串,-w -c请在 grep 命令中使用:

result=`grep -w -c $sportsName $file`;

man条目-w

   -w, --word-regexp
      Select only those lines containing matches that form whole
      words. The test is that the matching substring must either
      be at the beginning of the line, or preceded by a non-word
      constituent character. Similarly, it must be either at the
      end of the line or followed by a non-word constituent
      character. Word-constituent characters are letters,
      digits, and the underscore.
于 2013-10-28T09:07:30.533 回答