如何执行“如果变量 a 具有模式 'abc' 则执行 x,否则执行 y”(1 行)

如何执行“如果变量 a 具有模式 'abc' 则执行 x,否则执行 y”(1 行)

我想根据 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'

相关内容