4

我尝试了无数方法来获得我想要的东西,但似乎没有任何效果。我总是以类似的东西结束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

4

2 回答 2

3

这应该有效:

if [ $testv = '!' ]; then

这里有几个问题:

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

或者,您可以使用[[ ]]而不是[ ],因为它可以理解==(并且通常具有更清晰的语法):

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

顺便说一句,我相信这个脚本在 zsh 中运行的标签;如果没有,语法会有点不同(基本的 shell 没有[[ ]],除了 zsh 之外的任何东西都会对 $testv 的值进行不需要的解析,除非它在双引号中)。如果您不确定(或希望它是可移植的),这里有一个可以在任何 posix-compliant shell 中工作的版本:

if [ "$testv" = '!' ]; then
于 2012-02-19T09:48:04.717 回答
2

试试这个:

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

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

(虽然我不明白你的意思$(#testv)。)

于 2012-02-19T08:54:17.747 回答