Bash, jeśli na jednej linii

51

Chciałbym wiedzieć, jak mogę pisać, jeśli warunki w skrypcie bash w jednym wierszu.

Na przykład, jak mogę to napisać w jednym wierszu, a następnie umieścić kolejny taki sam w następnym?

if [ -f "/usr/bin/wine" ]; then
    export WINEARCH=win32
fi

Pytam o to, ponieważ mam sporo aliasów w moim .bashrc i mam ten sam .bashrc (zsynchronizowany) w wielu systemach, ale nie potrzebuję wszystkich aliasów w każdym systemie. Wstawiam większość z nich do instrukcji if i wszystko działa teraz pięknie, ale zajmują dużo miejsca, 3 linie każda plus pusta linia między nimi (lubię mieć je łatwo widoczne)

Użyję tej techniki również do zmiennych środowiskowych.

Horațiu Mlendea
źródło
4
Możesz także napisać[ -f "/usr/bin/wine" ] && export WINEARCH=win32
glenn jackman
3
Pamiętaj, że krótszy niekoniecznie jest lepszy. Operatory logiczne powłoki mogą uzyskać subtelne błędy logiczne. Wybierz, co jest łatwiejsze do odczytania i utrzymania.
glenn jackman

Odpowiedzi:

84

Napisałbyś to w ten sposób:

if [ -f "/usr/bin/wine" ]; then export WINEARCH=win32; fi

Pamiętaj, że można to również napisać (zgodnie z sugestią @glennjackman):

[ -f "/usr/bin/wine" ] && export WINEARCH=win32
dr_
źródło
1
Cóż, to było łatwe ... :) Czuję się trochę niezręcznie, kiedy o to pytam. Dziękuję za odpowiedź, która bardzo pomogła!
Horațiu Mlendea,
7
Jest jedna różnica. 1. wyrażenie zakończy działanie ze statusem 0, 2. wyrażenie zakończy działanie ze stanem innym niż 0, jeśli plik nie istnieje. Może to mieć znaczenie, jeśli użyjesz tego w niektórych zautomatyzowanych zadaniach, takich jak wdrażanie, gdzie powodzenie zadania zależy od statusu zakończenia polecenia.
Jānis Gruzis,
@ HorațiuMlendea oczywiście było łatwe. jeśli wiesz jak. Ale składnia jest skomplikowana, np. [1 == 1] jest błędem, ale [1 == 1] działa. I średniki. Jak możesz czuć się niezręcznie, nie znając jakiejś dziwnie źle zaprojektowanej składni. Twoje „uczucie” nie ma żadnego sensu. To było przydatne pytanie, nawet jeśli niestety nie rozumiesz dlaczego.
barlop
@ balop nie, całkowicie rozumiem, co masz na myśli i zgadzam się. Po prostu zrozumiałem poszczególne bity składające się na tę składnię (tą z &&). Zwykle składanie rzeczy jest łatwe i intuicyjne, ale jak powiedziałeś, ten język jest dość skomplikowany i niezbyt intuicyjny.
Horațiu Mlendea
4

Zauważyłem też, że po prostu wpisując dowolny kompleks, jeśli w przeciwnym razie naciśniesz, naciśnij klawisz Enter, a następnie po jego wykonaniu wystarczy nacisnąć strzałkę w górę. Wiersz poleceń oczywiście powtórzy ostatnie wpisane polecenie, ale w tym przypadku umieszcza je wszystkie w jednym wierszu, zgodnie z wymaganiami. Jest to sposób na oszukiwanie, ale jest skuteczny.

Alan
źródło
5
Zauważ, że może to zależeć od twojej powłoki (i być może dalej od jej ustawień). Niektóre szybkie testy na moim komputerze pokazują, że działa to w Bash (więc mają +1), ale Zsh zachowuje podziały linii po powrocie do poprzednich poleceń.
8bittree