2013-04-18 21 views
22

Jest całkiem jasne, że przy użyciu skryptów powłoki tego typu rzeczy można osiągnąć na wiele sposobów (więcej niż większość języków programowania) ze względu na wszystkie różne zmienne metody ekspansji i programy takie jak test i [ i [[ itpBash: Jak ustawić zmienną z argumentu iz domyślną wartością

teraz jestem po prostu szukasz

DIR=$1 or . 

znaczenia, moja zmienna DIR powinien zawierać zarówno to, co jest określone w pierwszym lub arg bieżący katalog.

Jaka jest różnica między tym a DIR=${1-.}?

Uważam, że składnia łącznika jest myląca i szukam bardziej czytelnej składni.

Dlaczego nie mogę tego zrobić?

DIR="$1" || '.' 

Zgaduję, to znaczy „jeśli $ 1 jest pusty, przypisanie nadal działa (DIR staje się pusty), a więc nieważny komenda«» nigdy nie zostanie stracony. "

+0

znalazłem moją odpowiedź na co dwukropek oznacza: http://wiki.bash-hackers.org/syntax/pe#use_a_default_value –

+2

Embrace języka. Nie wszystkie języki mają te same idiomy. 'DIR = $ {1: -.}' Jest całkowicie naturalnym sposobem wyrażenia tej logiki w dowolnej powłoce kompatybilnej z POSIX. – chepner

+1

Uważam, że ustępstwo jest całkowicie uzasadnione. Nie podoba mi się sposób, w jaki napisałem to pytanie. Byłem sfrustrowany, jak sądzę. Ale odkąd to opublikowałem, nigdy nie miałem problemu z zapamiętywaniem składni '$ {VAR: -default}'. Zamierzam edytować moje pytanie, aby było mniej małostkowe. Jestem pewien, że nie byłeś przykrywcą @chepner, ale masz absolutną rację! –

Odpowiedz

38

Widzę tu kilka pytań.

  1. „Mogę napisać coś, co rzeczywiście odzwierciedla tę logikę”

    Tak. Jest kilka sposobów na zrobienie tego. Oto jeden:

    if [[ "$1" != "" ]]; then 
        DIR="$1" 
    else 
        DIR=. 
    fi 
    
  2. „Jaka jest różnica między tym i DIR=${1-.}?”

    Składnia ${1-.} rozszerza się . jeśli $1 jest wyłączony, ale rozszerza się jak $1 jeśli $1 jest ustawiona, nawet jeśli $1 jest ustaw na pusty ciąg znaków.

    Składnia ${1:-.} rozwija się do ., jeśli $1 nie jest ustawiona lub jest ustawiony na pusty ciąg. Rozwija się jak $1 tylko wtedy, gdy $1 jest ustawiony na coś innego niż pusty ciąg.

  3. "Dlaczego nie mogę tego zrobić? DIR="$1" || '.' "

    Ponieważ jest to bash, nie perl lub rubin lub inny język. (Przepraszam, mój snideress.)

    W bash, || oddziela całe polecenia (technicznie oddziela potoki). Nie rozdziela wyrażeń.

    Tak DIR="$1" || '.' oznacza "wykonaj DIR="$1", a jeśli to wyjdzie z niezerowym kodem wyjścia, wykonaj '.'".

2

Jak o tym:

DIR=. 
if [ $# -gt 0 ]; then 
    DIR=$1 
fi 

$# jest liczbą argumentów podanych do skryptu, a -gt oznacza „większe niż”, więc w zasadzie ustawione DIR na wartość domyślną, a jeśli użytkownik określi Argument, a następnie ustaw dla niego wartość DIR.

+1

To nie jest okropne, chociaż cztery linie zdecydowanie wydają się zbyt szczegółowe, jak na mój gust. Wolałbym użyć rozszerzenia myślnika, ponieważ już wiem, co to znaczy w tym momencie. –

Powiązane problemy