2012-12-31 18 views
8

Powiel możliwe:
Ternary operator (?:) in BashCzy w bash występuje inline-if z przydziałem (warunkowym potrójnym)?

Gdyby to było AS3 lub Java, chciałbym wykonać następujące czynności:

fileName = dirName + "/" + (useDefault ? defaultName : customName) + ".txt"; 

Ale w skorupkach, które wydaje się niepotrzebnie skomplikowane, wymagające kilka linii kodu, a także sporo powtórzeń kodu.

if [ $useDefault ]; then 
    fileName="$dirName/$defaultName.txt" 
else 
    fileName="$dirName/$customName.txt" 
fi 

Można skompresować to wszystko w jedną linię, ale to ogromnie poświęca jasność.

Czy istnieje lepszy sposób zapisywania wiersza if z przypisaniem zmiennych w powłoce?

+0

Odpowiedź Williama Purcella jest mniej bezpośrednia niż moja, ale jeśli założenie, że '$ useDefault' kontroluje, czy użyć domyślnej nazwy, czy nie, może to być czystsze rozwiązanie. –

+0

Zaktualizowałem swoją odpowiedź, aby poprawnie cytować wszystko. –

Odpowiedz

9

Nie ma ?: operator warunkowy w powłoce, ale można zrobić kodu trochę mniej nadmiarowego tak:

if [ $useDefault ]; then 
    tmpname="$defaultName" 
else 
    tmpname="$customName" 
fi 
fileName="$dirName/$tmpname.txt" 

Albo można napisać własną funkcję powłoki, która działa jak operator ?::

cond() { 
    if [ "$1" ] ; then 
     echo "$2" 
    else 
     echo "$3" 
    fi 
} 

fileName="$dirname/$(cond "$useDefault" "$defaultName" "$customName").txt" 

chociaż to prawdopodobnie przesada (i ocenia wszystkie trzy argumenty).

Podziękowania dla Gordona Davissona za wskazanie w komentarzach, które cytują gniazdo w numerze $(...).

+0

Bardzo podoba mi się funkcja 'cond', która jest powodem, dla którego przyjąłem odpowiedź, chociaż pierwsze rozwiązanie również pozwala zaoszczędzić na powtarzającym się kodzie. – IQAndreas

+0

Powinieneś pozostawić '$ (cond ...)' wewnątrz podwójnych cudzysłowów (np. 'FileName =" $ dirname/$ (cond "$ useDefault" "$ defaultName" "$ customName"). Txt "') - - to zapobiegnie jakiejś prawie na pewno niechcianej dodatkowej analizie na zwrocie z łańcucha znaków. –

+0

@GordonDavisson: Myślałem o tym, ale pozostawia zmienne odniesienia '$ useDefault' i wsp. Poza cytatami. Nie jestem pewien, czy istnieje dobre rozwiązanie. –

16

Wystarczy napisać:

fileName=${customName:-$defaultName}.txt 

To nie całkiem tak samo jak to, co masz, ponieważ nie sprawdza useDefault. Zamiast tego sprawdza tylko, czy ustawiono customName. Zamiast ustawiać useDefault, gdy chcesz użyć wartości domyślnej, po prostu wyzeruj customName.

+0

Czy możesz podać więcej informacji na temat tego operatora ': -'? (lub przynajmniej jakaś nazwa, za pomocą której mogę wyszukiwać w Google). – IQAndreas

+1

Wystarczy wyszukać ': -' na stronie man. Każda dokumentacja 'sh' opisuje to w nagłówkach takich jak" rozszerzenie parametrów ". –

+4

Dla 'bash', patrz [rozszerzenie parametrów] (http://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter- Exxpansion); dla powłoki POSIX, patrz [rozszerzenie parametrów] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02). –

Powiązane problemy