如何執行「如果變數 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'

相關內容