你必须读取字符串1,我该怎么办?这是我的代码:
#!/bin/sh
echo "Enter your sting: "
read read string1
if [ grep -q $string1 file.txt ];then
echo "Found it"
else
echo "Sorry this string not in file"
fi
exit 0
答案1
- 您的
read
命令是错误的,它应该是read string1
(并且您应该使用-r
以防止read
混淆反斜杠read -r string1
:); - 测试也是错误的,因为
if grep -q $string1 file.txt
你不是在评估输出grep
而是在评估它的返回值; - 您应该传递该
-F
选项grep
以防止它解释这样的正则表达式元字符:if grep -qF $string1 file.txt
- 您应该使用双引号
$string1
来防止潜在的文件名扩展和/或单词拆分:if grep -qF "$string" file.txt
其他说明:
- 最后的
exit 0
是多余的并且不是真正需要的,好像脚本设法到达该点而没有出现错误,它0
无论如何都会返回; - 壳牌检测是调试脚本的非常有用的资源。
因此根据上述内容修改后的脚本如下:
#!/bin/sh
echo "Enter your sting: "
read string1
if grep -qF "$string1" file.txt;then
echo "Found it"
else
echo "Sorry this string not in file"
fi
答案2
我认为最好将结果(在本例中为匹配次数)存储在变量中。
也就是说,你有两个选择,用于grep -c
计算匹配的行数
count=$(grep -c "$string1" file.txt)
或者将匹配的行通过管道传输到wc
from grep -o
(--only-matches)
count=$(grep -o "$string1" file.txt | wc -l)
这将是具有第二个选项的完整脚本
#!/bin/sh
echo "Enter your string: "
read string1
count=$(grep -o "$string1" file.txt | wc -l)
if [ $count != 0 ];then
echo "Found it ($count times)"
else
echo "Sorry this string not in file"
fi
exit 0
另外,你写了read
两次。