Próbowałem dowiedzieć się, co jest z tym nie tak, ale po prostu nie mogę tego zrozumieć.
W tej części pojawia się błąd.
elif [ $operation = "man" ]; then
if [ $aug1 = "add" ]; then # <- Line 75
echo "Man Page for: add"
echo ""
echo "Syntax: add [number 1] [number 2]"
echo ""
echo "Description:"
echo "Add two different numbers together."
echo ""
echo "Info:"
echo "Added in v1.0"
echo ""
elif [ -z $aug1 ]; then
echo "Please specify a command to read the man page."
else
echo "There is no manual page for that command."
fi
Otrzymuję ten błąd:
calc_1.2: line 75: [: =: unary operator expected
if
oświadczenie w linii 75 potrzebujefi
.Odpowiedzi:
Jeśli wiesz, że zawsze będziesz używać bash, o wiele łatwiej jest zawsze użyć polecenia złożonego z podwójnym nawiasiem
[[ ... ]]
, zamiast wersji pojedynczego nawiasu zgodnej z Posix[ ... ]
. Wewnątrz[[ ... ]]
związku dzielenie słów i rozwijanie nazw ścieżek nie są stosowane do słów, więc możesz na nich polegaćaby porównać wartość
$aug1
z łańcuchemand
.Jeśli używasz
[ ... ]
, zawsze musisz pamiętać o podwójnym cytowaniu zmiennych:Jeśli nie zacytujesz rozszerzenia zmiennej, a zmienna jest niezdefiniowana lub pusta, znika z miejsca przestępstwa, pozostawiając tylko
która nie jest prawidłową składnią. (Nie powiedzie się również z innym komunikatem o błędzie, jeśli zostanie
$aug1
uwzględniony biały znak lub metaznaki powłoki).Nowoczesny
[[
operator ma wiele innych fajnych funkcji, w tym dopasowanie wyrażeń regularnych.źródło
Zajęło mi to trochę czasu, aby to znaleźć, ale zauważ, że jeśli masz błąd spacji, otrzymasz również ten sam błąd:
Poprawny:
vs
Jak zawsze ustawienie
-x
zmiennej debugowania pomaga znaleźć:źródło
Spróbuj przypisać wartość
$aug1
przed użyciem jej wif[]
instrukcjach; komunikat o błędzie zniknie później.źródło
mówisz ... :
myślę, że to tylko przestrzeń ... lubię to:
źródło
Możesz także ustawić wartość domyślną dla zmiennej, więc nie musisz używać dwóch „[”, co odpowiada dwóm procesom („[” to tak naprawdę program) zamiast jednego.
Ma następującą składnię: $ {VARIABLE: -default}.
Cała sprawa musi być przemyślana w taki sposób, że ta „domyślna” wartość różni się od „prawidłowej” wartości / treści.
Jeśli z jakiegoś powodu nie jest to możliwe, prawdopodobnie należy dodać krok, np. Sprawdzenie, czy w ogóle jest jakaś wartość, podobnie jak „if [-z $ VARIABLE]; następnie powtórz„ zmienna musi być wypełniona ”” lub „ jeśli [! -z $ VARIABLE]; wtedy # wszystko jest w porządku, kontynuuj resztę skryptu ".
źródło
[[
nie odradza dwóch procesów, jest to wbudowana powłoka (i[
jest także wbudowana w Bash).[[
różni się od[ [
, który traktuje drugi[
jako ciąg znaków