【问题标题】:bash if "$1" == "0" is always false when running function for bash promptbash if "$1" == "0" 在运行 bash 提示符的函数时始终为 false
【发布时间】:2020-03-03 05:35:46
【问题描述】:

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

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

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,但始终使用红色。

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

【问题讨论】:

  • 您必须单引号 PS1,否则它只会被评估一次,而不是每次绘制提示时。

标签: bash function if-statement prompt


【解决方案1】:

试试这个:

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 [[ ]] 优化

【讨论】:

  • 哦,哇,我不敢相信我错过了。我什至没有看,因为退出状态号正在改变,所以我认为它每次都会被调用。 1美元会成为全球性的还是什么?当函数只被调用一次时,$1 怎么会改变?
  • 所以这是正确的答案,但仍然想知道当函数只运行一次时退出代码在 echo $1 中是如何更新的。
【解决方案2】:

解释为什么你总是选择 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 是双引号,因为可以静态评估它。

【讨论】:

  • $?似乎是我脚本中的正确退出代码。 echo $1 输出 0,然后输出 127 表示错误的命令。
  • $?在我使用它的任何地方都不会扩展到文件路径。这什么时候会发生?同样在我的脚本中,您需要转义 \$?否则将被处理一次并且始终为 0。
  • @Brad :简单示例:复制并粘贴以下命令序列:touch '$r'; echo \$?。回声将扩展到$r
  • @Brad :在您发布的代码中,您只执行一次函数statColour,即在定义PS1 之前,而不是在每次调用期间。 Wiimm 的回答显示了一种解决方法,但忽略了未转义问号的问题。他至少应该通过\$\? 的状态码。我的回答使用了不同的方法(IMO 更清楚一点,但这当然是个人喜好问题),有了这个,你不必担心转义$?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
相关资源
最近更新 更多