-v 一元条件表达式不起作用

-v 一元条件表达式不起作用

我想检查给定的变量是否已设置-v。我很难理解错误来自哪里。文件中有以下脚本var-test.sh

MY_VAR="test"

if [ -v MY_VAR ]; then
  echo "MY_VAR set to $MY_VAR"
else
  echo "MY_VAR not set"
fi

当我运行它时:./var-test.sh我得到以下输出:

./var-test.sh: line 3: [: -v: unary operator expected
MY_VAR not set

但是当我在 shell 提示符中调用以下命令时:

MY_VAR="test"; if [ -v MY_VAR ]; then echo "MY_VAR set to $MY_VAR"; else; echo "MY_VAR not set"; fi

shell 不会对-v操作符产生任何抱怨,并且输出结果"MY_VAR set to test"与预期一致。这是怎么回事?我是不是忽略了某些显而易见的东西?

我认为这是因为使用单括号。当我切换到使用双括号时:

MY_VAR="test"

if [[ -v MY_VAR ]]; then
  echo "MY_VAR set to $MY_VAR"
else
  echo "MY_VAR not set"
fi

我收到以下错误:

./var-test.sh: line 3: conditional binary operator expected
./var-test.sh: line 3: syntax error near `MY_VAR'
./var-test.sh: line 3: `if [[ -v MY_VAR ]]; then'

输出zsh --version

zsh 5.7.1 (x86_64-apple-darwin19.0)

答案1

通过指定舍邦。当前脚本中没有 shebang。当从zsh 这样的脚本运行sh。显然sh您的系统中提供的任何内容都不支持[ -v …。Zsh 支持此功能,Bash 支持此功能,其他 shell 可能不支持。

看起来您想使用 Zsh,因此 shebang 应该是#!/bin/zsh或类似的。它必须是脚本的第一行。

相关内容