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ć!
myślę 'if' jako polecenie. Wszystko, co następuje, to argumenty oddzielone spacjami, tak jak każde inne polecenie. –
@BarryBrown Aby być precyzyjnym, 'if' jest słowem kluczowym:' type if' zwraca 'jeśli jest słowem kluczowym powłoki'. –
Dlaczego nie użyć słowa kluczowego "function'? –