bash if "$1" == "0" 始终为 false when 运行 function for bash prompt

bash if "$1" == "0" is always false when running function for bash prompt

我已经为此苦苦挣扎了很长时间。 尝试根据最后一个命令的退出代码更改颜色作为提示的一部分。

我已将提示缩减为最小示例:

Red="\[3[31m\]"
Green="\[3[32m\]"
Reset="\[3[0m\]"

statColour(){
    if [[ "" == "0" ]]; then
        echo -e "${Green}  "
    else
        echo -e "${Red}  "
    fi
}

export PS1="$(statColour $?)What Colour? $Reset"

尽管第一个实例中数字显然为 0,但结果始终使用红色。

我试过 [ -eq 0 都没有成功。为什么这不起作用?

试试这个:

Red="3[35m"
Green="3[32m"
Reset="3[0m"

statColour(){
    if [[  = 0 ]]; then
        echo -e "${Green}  "
    else
        echo -e "${Red}  "
    fi
}

export PS1="$(statColour $?)What Colour? $Reset"
#           ^
  1. 颜色定义已更改
  2. statColour 的调用现在每次都会调用,而不是只调用一次。
  3. if [[ ]] 优化

解释为什么你总是选择 false 分支:

您正在以 $? 作为参数调用 statColour。反斜杠确保 $ 按字面意义(而不是作为参数扩展的开头),因此您实际上得到了文字字符串 $?。由于 ? 是一个通配符,它​​正在生成文件名,即参数被名称为 $ 的所有文件替换,后跟一个字符。如果您的目录中没有这样的文件(可能是这种情况),则字符串 $? 将按字面意义传递给 statColour.

statColour里面,你写了

[[ "" == "0" ]]

意思是问字符串$?是否等于字符串0。从来没有这种情况,因此比较总是错误的。

对于你的问题,你可以试试这个方法(没有测试,所以你可能需要稍微调试一下):

statColour() {
  # Fetch the exit code of the last program
  local last_exit_code=$?
  if ((last_exit_code == 0)) # Numeric comparision
  then
    .....
  else
    ...
  fi
  # Preserve the exit code
  return $last_exit_code
} 

并将提示设置为

PS1='$(statColour) '"$Reset"

单引号确保 statColour 是动态求值的,而 $Reset 是双引号,因为可以静态求值。