如何测试命令管道的输出

时间:2017-02-01 19:56:59

标签: bash shell

这两行

 function some {
         ## myFunc(true) is just a pattern
         local isEnabled="grep myFunc(true) $indexFile | grep true"
         if [ -z $($isEnabled) ]; then ... fi
     }

给我: binary operator expected

但当我删除管道符号|时,它是如何工作的,如何使用管道执行命令?我正在使用sh

1 个答案:

答案 0 :(得分:1)

您收到该错误是因为$($isEnabled)正在扩展为空,[ -z ]需要参数。

  • 需要将myFunc(true)放入单引号或双引号,因为()具有特殊含义
  • 最好将$indexFile括在双引号中以防止出现同样的问题

您可以重写sh的代码:

function some {
  local isEnabled=$(grep 'myFunc(true)' "$indexFile" | grep true)
  if [ -z "$isEnabled" ]; then
    : your logic here
  fi
}

或者,更直接地说:

function some {
  # just interested in the presence or absence of a pattern
  # irrespective of the matching line(s)
  if grep 'myFunc(true)' "$indexFile" | grep -q true; then
    : your logic here
  fi
}

或者,在Bash中使用[[ ]]

function some {
  local isEnabled=$(grep 'myFunc(true)' "$indexFile" | grep true)
  if [[ $isEnabled ]]; then
    : your logic here
  fi
}
  • [[ $var ]][[ -z $var ]][[ -n $var ]]一样好。只要$var的长度大于>它就会评估为真。 0

  • 无需将[[ ]]中的变量括在引号中--Bash处理扩展而不会出现任何分词或通配符扩展问题。