bash 如果变量由函数设置

bash if variable set by function

我在 BASH 方面的经验有限,我正在寻找有关如何进行的一些指导,所以请多多包涵。

当我在 git 存储库中时,我正在尝试更改命令提示符,我可以使用我在 google 上找到的 post 来做到这一点,但我也想要根据回购的当前状态(干净、未跟踪的文件、修改的文件)添加颜色。

目前我的 .bashrc 文件末尾有这个:

parse_git_branch () {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/[]/'
}

modified () {
  git status 2> /dev/null | grep -q modified
}

untracked () {
  git status 2> /dev/null | grep -q Untracked
}

clean () {
  git status 2> /dev/null | grep -q clean
}

NO_COLOR="\[3[0m\]"
GREEN="\[3[0;32m\]"
YELLOW="\[3[0;33m\]"
RED="\[3[0;31m\]"

set_color () {

  if untracked ; then
    echo $RED
  elif modified ; then
    echo $YELLOW
  elif clean ; then
    echo $GREEN
  else
    echo $NO_COLOR
  fi
}

PS1="\u:\w$(set_color)$(parse_git_branch)$NO_COLOR> "

命令提示符发生了变化,但没有像我认为的那样改变颜色。

这是我得到的:
外部 git 回购 arod:~\[3[0m\]>
在 git 仓库中 arod:~/tos\[3[0;32m\][dev]>

我不确定如何获得我认为要评估的颜色,只是想从 BASH 经验比我多的人那里寻求一些指导。

如果有人正在寻找答案;或者至少是我使用的解决方案:

parse_git_branch () {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/[]/'
}

modified () {
  git status 2> /dev/null | grep -q modified
}

untracked () {
  git status 2> /dev/null | grep -q Untracked
}

clean () {
  git status 2> /dev/null | grep -q clean
}

NO_COLOR="3[0m"
GREEN="3[0;32m"
YELLOW="3[0;33m"
RED="3[0;31m"

set_color () {

  if untracked ; then
    echo -e $RED
  elif modified ; then
    echo -e $YELLOW
  elif clean ; then
    echo -e $GREEN
  else
    echo -e $NO_COLOR
  fi
}

PS1="\u:\w$(set_color)$(parse_git_branch)$NO_COLOR> "

问题中的代码与这个代码之间的主要区别是我确实添加了 -e 标志来回显,并从颜色变量中删除了 \'s。

希望这对某人有所帮助

编辑

在收到更多反馈后,现在是这样的:

parse_git_branch () {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/[]/'
}

no_color="3[0m"
green="3[0;32m"
yellow="3[0;33m"
red="3[0;31m"

set_color () {

  case "$(git status 2> /dev/null)" in
    *Untracked*)
      printf '%b' "$red";;
    *modified*)
      printf '%b' "$yellow";;
    *clean*)
      printf '%b' "$green";;
    *)
      printf '%b' "$no_color";;
  esac

}

PS1="\u:\w$(set_color)$(parse_git_branch)$no_color> "

所有这些都来自@Charles Duffy。
我唯一没有合并的是使用 tput 来获取颜色转义序列。