「変数 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

エラーが発生するのは、 と の後にスペースがないためです。これは、 が特定の文字列が空かどうかをテストするため[[のものであるためです。は非標準の機能であるため、その動作は のバージョンによって異なります。構造は POSIX であり、記述どおりに は任意の POSIX シェルおよび の任意のバージョンで動作します。-z[[bashcasebash

cmd1 && cmd2 || cmd3より一般的には、失敗した場合は通常、期待どおりに動作しないため、次のようなものは避けたほうがよいでしょうcmd2

また、すべてを 1 行にまとめる意味がわかりません。これは 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'

関連情報