我正在尝试设置我的PS1提示变量以动态选择颜色.为此,我使用颜色名称定义了一堆局部变量:
$ echo $Green
\033[0;32m
Run Code Online (Sandbox Code Playgroud)
但我希望在动态分配变量时使用它们,但我无法弄清楚如何正确扩展它们:
> colorstr="\${$color}"
> echo $colorstr
${Green}
Run Code Online (Sandbox Code Playgroud)
我试过一打组合eval,echo双引号,并且,没有似乎工作.我认为扩展变量的逻辑方式会导致错误:
> colorstr="${$color}"
-bash: ${$color}: bad substitution
Run Code Online (Sandbox Code Playgroud)
(为清楚起见,我使用的是>代替$提示字符,但我使用的是bash)
我该如何扩展该变量?即,以某种方式得到"绿色"这个词的价值\033[0;32m?并且优选地,还有bash或终端解析\033[0;32m为绿色.
编辑:我是误用${!x}和eval echo $x以前的,所以我接受了这些作为解决方案.对于(也许是病态的)好奇,函数和PS1变量都在这个要点:https://gist.github.com/4383597
Jon*_*ler 58
使用eval是经典的解决方案,但bash有一个更好的(更容易控制,更少犹豫不决)的解决方案:
${!colour}Bash(4.1)参考手册说:
如果参数的第一个字符是感叹号(!),则引入一个变量间接的级别.Bash使用从参数的其余部分形成的变量的值作为变量的名称; 然后展开此变量,并将该值用于替换的其余部分,而不是参数本身的值.这被称为间接扩张.
例如:
$ Green=$'\033[32;m'
$ echo "$Green" | odx
0x0000: 1B 5B 33 32 3B 6D 0A .[32;m.
0x0007:
$ colour=Green
$ echo $colour
Green
$ echo ${!colour} | odx
0x0000: 1B 5B 33 32 3B 6D 0A .[32;m.
0x0007:
$
Run Code Online (Sandbox Code Playgroud)
(该odx命令非常非标准,但只是将其数据转换为十六进制格式,右侧显示可打印字符.由于平原echo没有显示任何内容,我需要查看回显的内容,我使用了一个我写的老朋友大约24年前.)
per*_*eal 13
使用eval应该这样做:
green="\033[0;32m"
colorstr="green"
eval echo -e "\$$colorstr" test # -e = enable backslash escapes
test
Run Code Online (Sandbox Code Playgroud)
最后一次测试是绿色.