bash如果“ $ 1” ==“ 0”在运行bash提示功能时始终为false

问题描述 投票:0回答:2

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

我将提示简化为一个最小的示例:

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

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

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

尽管结果一开始数字显然为0,但仍始终使用红色。

enter image description here

我尝试了[$1 -eq 0,但没有成功。为什么这不起作用?

bash function if-statement prompt
2个回答
0
投票

尝试一下:

Red="\033[35m"
Green="\033[32m"
Reset="\033[0m"

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

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

0
投票

有关为什么总是选择false分支的说明:

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

statColour内部,您写道

[[ "$1" == "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是双引号,因为可以静态评估它。

© www.soinside.com 2019 - 2024. All rights reserved.