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