2012-12-24 6 views
5

zanim wpadłem skryptu WszedłemBash Script wraca prawdziwe dla obu, ale przeciwnym ciąg testuje

# export CPIC_MAX_CONV=500 

Następujące jest plik test1.script

#!/bin/bash 

function cpic() { 
    var="`export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } '`" 
    [[ $var=="" ]] && (echo "Empty String <<") 
    [[ $var!="" ]] && (echo "$CPIC_MAX_CONV") 
    echo "$var" ; 
} 

cpic 

Wyjście jest:

# test1.script ---- Me running the file 

Empty String << 
500 
CPIC_MAX_CONV="500" 

Niezależnie od tego, co używam "" lub "" lub [lub [[wynik jest taki sam. Zmienna CPIC_MAX_CONV znajduje się w powyższym skrypcie.

Używam tego w systemie Linux/CentOS 6.3.

Pomysł jest prosty: Aby ustalić, czy CPIC_MAX_CONV jest zdefiniowany w środowisku i zwrócić jego wartość. Jeśli jest puste miejsce, to oczywiście zmienna nie występuje w systemie.

Odpowiedz

4

Dlaczego zawsze masz rację? Zagrajmy trochę w twoim terminalu:

$ [[ hello ]] && echo "True" 

Jak myślisz, co to jest wyjście? (spróbuj!) A z następującymi?

$ [[ "" ]] && echo "True" 

(spróbuj!).

W porządku, więc wydaje się, że niepusty łańcuch jest równoważny z prawdziwym wyrażeniem, a pusty ciąg (lub zmienna nieustawiona) jest odpowiednikiem fałszywego wyrażenia.

Co zrobiłeś jest następujący:

[[ $var=="" ]] 

i

[[ $var!="" ]] 

więc dał niepusty ciąg, który jest prawdziwy!

W celu przeprowadzenia testu, rzeczywiście trzeba przestrzenie między tokeny:

[[ $var == "" ]] 

zamiast. Teraz Twój test będzie lepiej napisany jako:

if [[ -z "$var" ]]; then 
    echo "Empty String <<" 
else 
    echo "$CPIC_MAX_CONV" 
fi 

(bez podpowłok i tylko z jednym testem).

Jest więcej do powiedzenia na temat Twojego stylu skryptów. Bez urazy, powiedziałbym, że jest naprawdę źle:

  • Nie używaj odcisków! Zamiast tego użyj konstrukcji $(...). Stąd:

    var="$(export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } ')" 
    
  • Nie używaj function blah zdefiniować funkcję.Twoja funkcja powinna zostać zdefiniowana jako:

    cpic() { 
        local var="$(export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } ')" 
        if [[ -z "$var" ]]; then 
         echo "Empty String <<" 
        else 
         echo "$CPIC_MAX_CONV" 
        fi 
    } 
    

Och, użyłem słowa kluczowego local, bo myślę, że nie zamierzamy użyć zmiennej var poza funkcją cpic.

Jaki jest cel funkcji cpic, a zwłaszcza rzeczy, w których definiujesz zmienną var? Byłoby to trudne do opisania (ponieważ jest tak wiele przypadków, o których nie myślałeś). (Btw, twoje grep wydaje się naprawdę bezużyteczne tutaj). Oto kilka przypadków pomijane:

  • Zmienna eksportowana jest nazwany somethingfunnyCPIC_MAX_CONVsomethingevenfunnier
  • Wyeksportowany zmienna zawiera ciąg CPIC_MAX_CONV gdzieś, np

    export a_cool_variable="I want to screw up Randhawa's script and just for that, let's write CPIC_MAX_CONV somewhere here" 
    

Ok, I don” Chcę opisać, co dokładnie robi twoja linia, ale domyślam się, że twoim celem jest ustalenie, czy zmienna CPIC_MAX_CONV jest ustawiona i oznaczona do eksportu, prawda? W takim przypadku lepiej byłoby po prostu:

cpic() { 
    if declare -x | grep -q '^declare -x CPIC_MAX_CONV='; then 
     echo "Empty String <<" 
    else 
     echo "$CPIC_MAX_CONV" 
    fi 
} 

Będzie bardziej wydajny i o wiele bardziej wytrzymały.

Och, ja teraz tylko czytanie koniec postu. Jeśli chcesz po prostu powiedzieć, czy zmienna CPIC_MAX_CONV jest ustawiona (do jakiejś niepustej wartości - wydaje ci się, że nie obchodzi cię, czy jest zaznaczona do eksportu, czy nie, popraw mnie, jeśli się mylę), to jest jeszcze prostsze (i będzie być o wiele bardziej wydajnym):

cpic() { 
    if [[ "$CPIC_MAX_CONV" ]]; then 
     echo "Empty String <<" 
    else 
     echo "$CPIC_MAX_CONV" 
    fi 
} 

będzie również działać!

+0

myślę 'if' jako polecenie. Wszystko, co następuje, to argumenty oddzielone spacjami, tak jak każde inne polecenie. –

+0

@BarryBrown Aby być precyzyjnym, 'if' jest słowem kluczowym:' type if' zwraca 'jeśli jest słowem kluczowym powłoki'. –

+0

Dlaczego nie użyć słowa kluczowego "function'? –

1

Czy naprawdę obchodzi, czy CPIC_MAX_CONV jest zmienna w porównaniu prostu „to zmienna, która może być zmienna”? Najprawdopodobniej nie, nie tylko dlatego, że jeśli jest to zmienna, ale nie zmienna środowiskowa, każdy uruchamiany skrypt nie zobaczy wartości (ale jeśli będziesz nalegać na używanie aliasów i funkcji, to może to mieć znaczenie, ale nadal prawdopodobnie nie). Wydaje

więc, że staramy się sprawdzić, czy CPIC_MAX_CONV ustawiony jest niepusty wartości. Jest wiele prostych sposobów na zrobienie tego - a potem jest sposób, w jaki próbujesz.

: ${CPIC_MAX_CONV:=500} 

Zapewnia to, że CPIC_MAX_CONV jest ustawiony na niepustą wartość; używa on 500, jeśli wcześniej nie było ustawionej wartości. Polecenie : (dwukropek) ocenia swoje argumenty i raportuje powodzenie. Możesz wyeksportować zmienną po jej utworzeniu, jeśli chcesz z export CPIC_MAX_CONV.

Jeśli trzeba mieć zmienny (nie ma odpowiednie ustawienie domyślne), a następnie użyć:

: ${CPIC_MAX_CONV:?} 

lub

: ${CPIC_MAX_CONV:?'The CPIC_MAX_CONV variable is not set but must be set'} 

Różnica polega na tym, że można użyć komunikat domyślny (” CPIC_MAX_CONV: parametr null lub nie jest ustawiony ") lub określ swój własny.

Jeśli masz zamiar użyć tylko raz wartość, można zrobić „w locie” Zmiana w poleceniu z:

cpic_command -c ${CPIC_MAX_CONV:-500} ... 

ta nie tworzy zmienną, jeśli nie istnieje, w przeciwieństwie do notacji :=.

We wszystkich tych zapisach używałem dwukropka jako części operacji. To wymusza "zerowy lub nie ustawiony"; możesz ominąć dwukropek, ale to pozwala pustemu łańcuchowi jako poprawnej wartości, która prawdopodobnie nie jest tym, czego potrzebujesz. Zauważ, że ciąg składający się tylko z pustego jest "nie pusty"; jeśli musisz potwierdzić, że masz niepusty łańcuch, musisz pracować trochę ciężej.


Nie analizuję niewłaściwego użycia polecenia [[; gniourf_gniourf dostarczył znakomitą deconstruction tego, ale pominęło prostsze zapisy dostępne do wykonania tego, co wydaje się być zadaniem.

+0

Dobra uwaga! '+ 1' –

-1

Potrzebujesz miejsca w swoich warunkach.

#!/bin/bash 

function cpic() { 
    var="`export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } '`" 
    [[ $var == "" ]] && (echo "Empty String <<") 
    [[ $var != "" ]] && (echo "$CPIC_MAX_CONV") 
    echo "$var" ; 
} 

cpic 
+0

Nie jestem pewien, czy twoja odpowiedź dodaje coś ciekawego do innych. Poza tym, zostawiasz wszystkie błędy, które OP ma (użycie backticks, użycie bezużytecznych podpowłok, bezużyteczne użycie 'grep', przestarzałe użycie słowa kluczowego function, może nie najlepszy algorytm do osiągnięcia tego, co stara się osiągnąć). '-1'. –

+0

Bez urazy, ale odpowiedziałem na temat pytania. OP nie pytał o najlepsze praktyki kodowania. –

+0

Bez urazy. Następnie, przynajmniej wyjaśnij, dlaczego osoba pytająca uzyskała ten dość mylący wynik. –

0

Spróbuj tego:

#!/bin/bash 
function cpic() {  
    var="`export | grep -i "CPIC_MAX_CONV"`" 
    [ "$var" = "" ] && (echo "Empty String <<") 
    [ "$var" != "" ] && echo "$CPIC_MAX_CONV" 
} 
cpic 
+0

Po co odpowiadać na pytania i nie podawać żadnych nowych informacji? –

Powiązane problemy