Как сделать «если переменная 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 и любой версии 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'

Связанный контент