Vorgehensweise: „Wenn die Variable A das Muster ‚abc‘ hat, führe x aus, andernfalls y“ (in 1 Zeile)

Vorgehensweise: „Wenn die Variable A das Muster ‚abc‘ hat, führe x aus, andernfalls y“ (in 1 Zeile)

Ich möchte einen Alias ​​abhängig von der Musterübereinstimmung einer Umgebungsvariable in einer Zeile festlegen.

Ich versuche:

[[$HOSTNAME =~ 'q20' ]] && alias a='cd ~/a1' || alias a='cd ~/a99'

aber ich bekomme-bash: [[uscamwebq20.boston.zipcar.com: command not found

Ich habe auch versucht:

$ [ -z $HOSTNAME =~ q20 ] && alias a='cd ~/a1' || alias a1='cd ~/a99'

aber ich bekomme-bash: [: too many arguments

Antwort1

case $HOSTNAME in (*q20*) alias a='cd ~/a1';; (*) alias a='cd ~/a99'; esac

Sie erhalten eine Fehlermeldung, weil nach Leerzeichen fehlen [[und weil -zgetestet werden soll, ob eine bestimmte Zeichenfolge leer ist. [[ist eine nicht standardmäßige Funktion. Ihr Verhalten hängt von der Version von ab bash. Die caseStruktur ist POSIX und funktioniert wie geschrieben in jeder POSIX-Shell und jeder Version von bash.

Generell ist es auch besser, sich von Dingen wie fernzuhalten, cmd1 && cmd2 || cmd3da es im Allgemeinen nicht das gewünschte Ergebnis liefert, wenn cmd2es fehlschlägt.

Außerdem sehe ich keinen Sinn darin, alles in eine Zeile zu packen. Das kommt ja schließlich in eine RC-Datei, oder? Dann ist es viel lesbarer, wenn es auf mehreren Zeilen steht.

case $HOSTNAME in
  (*q20*) alias a='cd ~/a1';;
      (*) alias a='cd ~/a99'
esac

ist lesbarer und portabler als:

if [[ $HOSTNAME =~ q20 ]]; then
  alias a='cd ~/a1'
else
  alias a='cd ~/a99'
fi

selbst lesbarer (und korrekter) als:

[[ $HOSTNAME =~ q20 ]] &&
  alias a='cd ~/a1' ||
  alias a='cd ~/a99'

selbst lesbarer als

[[ $HOSTNAME =~ q20 ]] && alias a='cd ~/a1' || alias a='cd ~/a99'

Antwort2

Sie können die erste Form verwenden, müssen aber nach dem ein Leerzeichen einfügen [[. Siehe:

$ type [[
[[ is a shell keyword

$ help [[
[[ ... ]]: [[ expression ]]
    Execute conditional command.

Ihr Befehl sollte also folgendermaßen aussehen:

[[ $HOSTNAME =~ 'q20' ]] && alias a='cd ~/a1' || alias a='cd ~/a99'

verwandte Informationen