.png)
Я хочу задать псевдоним в зависимости от соответствия шаблону переменной среды в 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'