Wie kann ich ein if then else mit dem Format [] verkürzen?

Wie kann ich ein if then else mit dem Format [] verkürzen?

Ich möchte es auf einen Einzeiler verkürzen:

if ls --version 2>/dev/null | grep -q 'coreutils'; then alias ls='ls --color=always'
else alias ls='ls -G'
fi

Ich verwende es häufig []für Bedingungen, z. B., [ -z(or -n) condition]musste in diesem Format aber bisher noch keinen „else“-Teil erstellen.

In Ruby würde ich Folgendes tun: condition ? true : false Gibt es ein Äquivalent in Bash?

Ich habe es versucht

[ -z ls --version 2>/dev/null | grep -q 'coreutils'] ? alias ls='ls --color=always' : alias ls='ls -G'

aber das ist offensichtlich nicht der richtige Weg.

Ich möchte einen Einzeiler, weil ich möchte, dass alles .bashrcin ein eher kleines Fenster (< ~50 Zeilen) passt. Wie bei anderen Mehrzeilern komprimiere ich sie daher, wenn möglich, zu Einzeilern. Für dieses Beispiel bin ich bereit, die Lesbarkeit zugunsten der Größe zu opfern.

Ich habe auch versucht:

[ -z ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'

Und

[ -n ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'

Und

[ ls --version 2>/dev/null | grep -q 'coreutils'] && alias ls='ls --color=always' || alias ls='ls -G'

aber ich bekomme immer den Alias ​​„else“ und nicht den Alias ​​„then“

Ich könnte es einfach rückgängig machen, aber ich vermute, dass das nichts nützen würde, da es nicht richtig funktioniert. Die einzige Möglichkeit, sicherzugehen, ist, es unter OSX auszuprobieren, und ich verwende gerade Ubuntu.

Antwort1

kurz und knapp;

Verwenden

ls --color=always > /dev/null 2>&1 && alias ls='ls --color=always' || alias ls='ls -G'`

Details...
[...]werden nur benötigt, um bedingte Ausdrücke auszuwerten (Statistiken von Dateien, Stringvergleiche, numerische Vergleiche; siehe CONDITIONAL EXPRESSIONSin bash(1)). Sie würden dafür auch in einer if ... ; then ...; elseKonstruktion benötigt.

Für relativ einfache Konstrukte

if CONDITION; then
    EXPR1
else
    EXPR2
fi

kann ersetzt werden durch

CONDITION && EXPR1 || EXPR2

[...]Wenn Sie es im ersten Fall nicht brauchen , brauchen Sie es auch im zweiten nicht.

In Ihrem Fall CONDITIONist ls --version 2>/dev/null | grep -q 'coreutils'dies der Rückgabecode von grep. Sie können also einfach schreiben

ls --version 2>/dev/null | grep -q 'coreutils' && alias ls='ls --color=always' || alias ls='ls -G'

Übrigens: Es wäre einfacher, direkt zu prüfen, ob lsFolgendes unterstützt wird :--color

ls --color=always > /dev/null 2>&1 && alias ls='ls --color=always' || alias ls='ls -G'

Antwort2

Mit zshkann es komprimiert werden zu:

if {ls --version|&grep -q coreutils} {alias ls='ls --color=always'
} else {alias ls='ls -G'}

Die cmd1 && cmd2 || cmd3Konstruktion als Ersatz für if/then/else sollte grundsätzlich vermieden werden, da es nicht dasselbe ist.

In

cmd1 && cmd2 || cmd3`

cmd2wird ausgeführt, wenn cmd1zurückgegeben wird true. Und cmd3wird ausgeführt, wenn einer dercmd1 odercmd2gibt false zurück.

In Ihrem Fall ist es sehr unwahrscheinlich, dass cmd2( alias) „false“ zurückgibt, aber im Allgemeinen vergisst man das Problem leicht. Deshalb ist es am besten, diese Konstruktion von vornherein zu vermeiden.

Die einzigerealDies kann beispielsweise dann nützlich sein, wenn Sie Code schreiben möchten, der sowohl in Bourne-ähnlichen als auch in csh-ähnlichen Shells (oder rc-ähnlichen Shells, bei denen das ebenfalls funktioniert) funktioniert und die if/then/elseKonstrukte eine unterschiedliche Syntax aufweisen.

verwandte Informationen