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"
# ^
- 颜色定义已更改
statColour
的调用现在每次都会调用,而不是只调用一次。
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
是双引号,因为可以静态求值。
我已经为此苦苦挣扎了很长时间。 尝试根据最后一个命令的退出代码更改颜色作为提示的一部分。
我已将提示缩减为最小示例:
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"
# ^
- 颜色定义已更改
statColour
的调用现在每次都会调用,而不是只调用一次。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
是双引号,因为可以静态求值。