【问题标题】:"Unexpected operator" from [ $var -eq 1 ] [duplicate][ $var -eq 1 ] 中的“意外运算符” [重复]
【发布时间】:2015-08-17 05:36:06
【问题描述】:

我在我的 bash 脚本中使用了这个条件

if [ $USE_TEST -eq 1 ]; then
echo "Hello"
fi

我将USE_TEST 作为环境变量传递。

如果我传递 env 变量,那么 shell 执行正常,但如果我没有那个变量,那么我得到这个

[: -eq: unexpected operator

我该如何解决这个问题

【问题讨论】:

  • 看起来$USE_TEST 未定义

标签: linux bash shell


【解决方案1】:

这是引号很重要的问题之一;当 $USE_TEST 未定义时,您的语句扩展为:

if [ -eq 1 ]; then

常见修复:

if [ "$USE_TEST" -eq 1 ]; then

...虽然这也意味着切换到字符串比较,因为-eq 会以空字符串中断:

if [ "$USE_TEST" = 1 ]; then

但您也可以考虑使用[[(它是一个内置的bash)或${USE_TEST:-0}(它指定一个默认值)。

【讨论】:

  • 另一个常见的解决方案是${USE_TEST?},如果变量未定义,它会生成错误并中止脚本。或者 ${USE_TEST:?} 如果变量扩展为空字符串也会中止。
  • 如果我使用 [[ 那么语法是什么。是 th sok [[ $USE_TEST -eq 1 ]]
【解决方案2】:

分配默认值(例如 0)来避免空变量:

if [ ${USE_TEST:=0} -eq 1 ]; then

来自man bash

${parameter:=word}:分配默认值。如果参数未设置或为空,则将单词的扩展分配给参数。然后替换参数的值。

【讨论】:

  • ${USE_TEST:=0} 也会在 makefile 中工作,我的意思是 VAR1=${USE_POSTGRES:=0}(在 makefile 中)
  • @user3214546:你必须非常小心makefile${USE_POSTGRES:=0}make 有含义,但与 shell 中的含义不同。您可能会在makefile 的shell 片段中使用$${USE_POSTGRES:=0};我认为你不能在make 宏定义中真正做你想做的事。或者不使用 GNU make 扩展。
【解决方案3】:

我假设这是一个布尔值,可以是 1 或 0,如果未定义,则默认为 0。在这种情况下,您可以使用特殊的 bash 语法:

if (( USE_TEST ));
    echo "using test"
fi

“(”括号用于数值。在这种情况下可以省略美元符号。

【讨论】:

  • 如果我使用这个,我是否需要定义0默认值或者它可以在没有定义默认0值的情况下工作
  • 这个数字将被测试为类似于 C 和其他一些编程语言的操作方式的真实性。 0 为假,其他数字为真。非数字字符串将被转换为数字,在大多数情况下产生 0,即 false。特别是,空字符串(和未定义的变量)将是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 2021-01-24
相关资源
最近更新 更多