我想根据 1 行中的环境变量模式匹配设置别名。
我在尝试:
[[$HOSTNAME =~ 'q20' ]] && alias a='cd ~/a1' || alias a='cd ~/a99'
但我得到-bash: [[uscamwebq20.boston.zipcar.com: command not found
我也尝试过:
$ [ -z $HOSTNAME =~ q20 ] && alias a='cd ~/a1' || alias a1='cd ~/a99'
但我得到-bash: [: too many arguments
答案1
case $HOSTNAME in (*q20*) alias a='cd ~/a1';; (*) alias a='cd ~/a99'; esac
您收到错误,因为 和 之后缺少空格[[
,因为-z
是为了测试特定字符串是否为空。[[
是一个非标准功能,它的行为方式取决于bash
.该case
结构是 POSIX,并且所写的可以在任何 POSIX shell 和任何版本的bash
.
更一般地说,最好远离类似的事情,cmd1 && cmd2 || cmd3
因为如果失败,它通常不会做你想做的事cmd2
。
另外,我不认为将所有内容都放在一行上有什么意义。那是要进入某个 rc 文件的东西,对吗?如果是多行的话,会更清晰。
case $HOSTNAME in
(*q20*) alias a='cd ~/a1';;
(*) alias a='cd ~/a99'
esac
比以下内容更清晰、更便携:
if [[ $HOSTNAME =~ q20 ]]; then
alias a='cd ~/a1'
else
alias a='cd ~/a99'
fi
它本身比以下内容更清晰(也更正确):
[[ $HOSTNAME =~ q20 ]] &&
alias a='cd ~/a1' ||
alias a='cd ~/a99'
本身比
[[ $HOSTNAME =~ q20 ]] && alias a='cd ~/a1' || alias a='cd ~/a99'
答案2
您可以使用第一种形式,但需要在 后面添加一个空格[[
。看:
$ type [[
[[ is a shell keyword
$ help [[
[[ ... ]]: [[ expression ]]
Execute conditional command.
所以你的命令应该是这样的:
[[ $HOSTNAME =~ 'q20' ]] && alias a='cd ~/a1' || alias a='cd ~/a99'