unix if语句中的grep命令

9rnv2umw  于 2023-08-04  发布在  Unix
关注(0)|答案(3)|浏览(158)
#!/bin/bash
read -p "enter search term here: " searchT

if [[ $(cat test.txt | grep -wi '$searchT') ]]; then     
    echo "$(cat test.txt | grep '$searchT' && wc -l) number of matches found"
    echo $(cat test.txt | grep '$searchT')

else echo "no match found"    

fi

exit 0

字符串
如果if statement为true,我如何使脚本运行。当我运行脚本时,脚本将输出else语句。因为没有值可与grep命令进行比较。

31moq8wy

31moq8wy1#

我们并不清楚您要匹配的是什么,但请记住,if接受一个命令并计算其返回值。如果匹配,则grep成功;如果不匹配,则失败。所以你可能只想做:

if grep -q -wi "$searchT" test.txt; then
   ...
fi

字符串
请注意,您应该使用双引号,以便展开“$searchT”,并将其值作为参数传递给grep,而不需要cat
在您的原始代码中,您有一行echo $(cat test.txt | grep '$searchT'),它有几个问题,但我将只解决反模式echo $(cmd)$()收集cmd的输出,并将其作为参数传递给echo,然后由echo写入这些参数。而不是echo $(cmd),你几乎总是可以只做cmd和削减中间人。(echo会压缩空白,也许会将cmd的一些输出当作标志,所以输出并不总是相同的,但它几乎总是你想要的。如果您实际上是有意使用echo $(cmd)来压缩空白,或者在cmd的输出中使用标志,则会出现代码可读性问题!)在这种情况下,有一个比使用echo更简单的解决方案。只需在grep命令中省略-q,并写入输出即可。

c8ib6hqw

c8ib6hqw2#

下面是另一种缓存结果的方法:mapfile将其stdin消耗到数组中,每行都是一个数组元素。

mapfile -t results < <(grep -wi "$searchT" test.txt)
num=${#results[@]}

if ((num == 0)); then
    echo "no match found"
else
    echo "found $num matches"
    printf "%s\n" "${results[@]}"
fi

字符串

jljoyd4f

jljoyd4f3#

#!/bin/bash

if [ $((n=$(grep -wic "$searchT" test.txt))) -ge 0 ]; then
    echo "found ${n}"
else
    echo "not found ${n}"
fi

字符串
根据评论修改:

#!/bin/bash

if n=$(grep -wic "$searchT" test.txt); then
    echo "found ${n}"
else
    echo "not found ${n}"
fi

相关问题