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

7 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
}
Run Code Online (Sandbox Code Playgroud)

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

Gor*_*son 4

这应该有效:

if [ $testv = '!' ]; then
Run Code Online (Sandbox Code Playgroud)

这里有几个问题:

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

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

if [[ $testv == '!' ]]; then
Run Code Online (Sandbox Code Playgroud)

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

if [ "$testv" = '!' ]; then
Run Code Online (Sandbox Code Playgroud)