无法获得如果评估$的结果?正确地

时间:2014-06-12 07:41:37

标签: bash grep

所以这就是我想要做的。我想通过两个字符串的文件grep,然后打印出用户是否存在字符串。

grep rn.jar $start_catalina #2&>1
echo $? #2&>1
    if [ $? -eq 0 ]; then
    printf "%s\n" "RN_JAR variable set correctly."
else printf "%s\n" "RN_JAR variabe not correctly set. Please set it."
      fi

grep $\RN_JAR $start_catalina 2&>1
echo $? 2&>1
if [ $? = 0 ]; then
printf "%s\n" "RN_JAR variable set correctly."
else printf "%s\n" "RN_JAR variable not set correctly."

fi  

我以为我有这个工作,但后来我意识到第二次测试总是评估为真。有一次,我将上述所有内容汇总在一个大的if构造中,但我永远不会得到第二个声明来评估为假。我将它们分成两个单独的语句,现在既没有评估为假(换句话说,如果我将字符串从catalina.sh中拉出来,即使返回为1,它仍会打印语句,就好像它是真的一样)。在将它们分开的时候,我设法以某种方式打破了它们。

我知道这很丑陋并且有一种更简单的方法可以实现这一目标但是现在,我只是有一个盲点,为什么我不能让这些字符串评估为假。我确信我做的事情显然是我看不到的,但对于我的生活,我无法弄清楚它是什么。

4 个答案:

答案 0 :(得分:2)

而不是:

  1. 正在运行grep并放弃其输出
  2. 稍后评估$?
  3. 您可以像这样使用grep -q

    if grep -Fq "rn.jar" $start_catalina; then
       printf "%s\n" "RN_JAR variable set correctly."
    else
       printf "%s\n" "RN_JAR variabe not correctly set. Please set it."
    fi
    

    根据man grep

    -q, --quiet, --silent
    
      

    安静模式:抑制正常输出。 grep只搜索文件,直到找到匹配为止,进行搜索                可能更便宜。

答案 1 :(得分:1)

echo $? #2&>1会重置$?

的值

你需要

grep rn.jar $start_catalina #2&>1
exitval=$?
echo $exitval #2&>1
if [ $exitval -eq 0 ]; then
  printf "%s\n" "RN_JAR variable set correctly."
else
  printf "%s\n" "RN_JAR variabe not correctly set. Please set it."
fi

grep $\RN_JAR $start_catalina 2&>1
exitval=$?
echo $exitval 2&>1
if [ $exitval = 0 ]; then # this should not work as it evaluates as string comparison
  printf "%s\n" "RN_JAR variable set correctly."
else
  printf "%s\n" "RN_JAR variable not set correctly."
fi  

答案 2 :(得分:1)

问题是$?给出了最后一个命令的退出值。对于脚本中的两个if测试,这将是前一个echo命令(不是grep),它应该总是成功...

答案 3 :(得分:0)

当您执行echo $?时,您正在打印最后一个命令的结果,但是要将其销毁,因为在此之后,$?将是echo的结果,而不是之前的命令。 echo可能会成功。

解决方案是使用变量:

RES=$?
echo $RES
if [ $RES -eq 0 ]; then
...