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

Mic*_*ant 0 bash

我想根据 1 行中的环境变量模式匹配来设置别名。

我在尝试:

[[$HOSTNAME =~ 'q20' ]] && alias a='cd ~/a1' || alias a='cd ~/a99'
Run Code Online (Sandbox Code Playgroud)

但我明白了 -bash: [[uscamwebq20.boston.zipcar.com: command not found

我也试过:

$ [ -z $HOSTNAME =~ q20 ] && alias a='cd ~/a1' || alias a1='cd ~/a99'
Run Code Online (Sandbox Code Playgroud)

但我明白了 -bash: [: too many arguments

Sté*_*las 7

case $HOSTNAME in (*q20*) alias a='cd ~/a1';; (*) alias a='cd ~/a99'; esac
Run Code Online (Sandbox Code Playgroud)

您收到错误,因为后面缺少空格[[,因为-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
Run Code Online (Sandbox Code Playgroud)

比以下内容更易读和便携:

if [[ $HOSTNAME =~ q20 ]]; then
  alias a='cd ~/a1'
else
  alias a='cd ~/a99'
fi
Run Code Online (Sandbox Code Playgroud)

本身比以下内容更清晰(也更正确):

[[ $HOSTNAME =~ q20 ]] &&
  alias a='cd ~/a1' ||
  alias a='cd ~/a99'
Run Code Online (Sandbox Code Playgroud)

本身比

[[ $HOSTNAME =~ q20 ]] && alias a='cd ~/a1' || alias a='cd ~/a99'
Run Code Online (Sandbox Code Playgroud)