.png)
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 -z
getestet 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 case
Struktur 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 || cmd3
da es im Allgemeinen nicht das gewünschte Ergebnis liefert, wenn cmd2
es 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'