在ZSH中捕获并测试输出命令

时间:2012-02-19 08:51:26

标签: zsh command-substitution

我尝试了无数种方法来获得我想要的东西,但似乎没有任何效果。我总是得到类似2:not found的内容。

我想捕获一个命令的输出,然后测试它是否等于“!”,如下所示:

function test() {
  local testv=$(command) 2>/dev/null
  if [ $(#testv) == "!" ]; then
    echo "Exclamation mark!"
  else
    echo "No exclamation mark."
  fi
}

我应该如何重写上面的代码以避免错误test:2: = not found

2 个答案:

答案 0 :(得分:3)

这应该有效:

if [ $testv = '!' ]; then

这里有几个问题:

  • $(...)运行命令并替换其输出;您想要替换变量值,因此请使用$var${var}
  • 我不知道#在那里做了什么。 ${#var}将得到$ var的长度,但这不是你想要的。
  • test命令([是其同义词)不理解==,因此请使用=(如果您是C程序员,那么看错误,但这是shell而不是C)。
  • 我不认为这是脚本中的问题,但对于交互式输入"!"不能达到您的预期。我使用'!'来确保感叹号不能被解释为历史选项。

或者,您可以使用[[ ]]代替[ ],因为它理解==(并且语法通常更清晰):

if [[ $testv == '!' ]]; then

BTW,我相信这个脚本在zsh中运行的标签;如果没有,语法将有点不同(基本shell没有[[ ]],除了zsh之外的任何东西都会对$ testv的值进行不必要的解析,除非它是双引号)。如果您不确定(或希望它是可移植的),这里的版本应该适用于任何符合posix标准的shell:

if [ "$testv" = '!' ]; then

答案 1 :(得分:2)

试试这个:

local testv=$(command 2>/dev/null)

因为它是您要重定向的命令的输出。

(我不知道$(#testv)你的意思。)