Sizin $VARIABLEboşluk veya başka özel karakterler içeren bir dize ise ve tek köşeli parantez kullanılıyorsa (bu testkomut için bir kısayoldur ), dize birden çok kelimeye bölünebilir. Bunların her biri ayrı bir argüman olarak ele alınır.
Böylece bir değişken birçok argümana bölünür :
VARIABLE=$(/some/command);
# returns "hello world"
if [ $VARIABLE == 0 ]; then
# fails as if you wrote:
# if [ hello world == 0 ]
fi
Aynı şey, boşluk veya diğer özel karakterleri içeren bir dizeyi kapatan herhangi bir işlev çağrısı için de geçerlidir.
Kolay düzeltme
Değişken çıktıyı çift tırnak içine alın ve bir dize (bu nedenle bir bağımsız değişken) olarak kalmaya zorlayın. Örneğin,
VARIABLE=$(/some/command);
if [ "$VARIABLE" == 0 ]; then
# some action
fi
Bu kadar basit. Ancak, değişkeninizin boş bir dize veya boşluktan başka bir şey içermeyeceğini garanti edemezseniz aşağıdaki "Ayrıca dikkatli olun ..." a atlayın.
Veya alternatif bir düzeltme , çift köşeli parantez kullanmaktır (bu new testkomut için bir kısayoldur ).
Bu sadece bash (ve görünüşte korn ve zsh) olarak bulunur ve bu nedenle /bin/shvb. Olarak adlandırılan varsayılan kabuklarla uyumlu olmayabilir .
Bu, bazı sistemlerde konsoldan çalışabileceğicron anlamına gelir, ancak her şeyin nasıl yapılandırıldığına bağlı olarak başka bir yerde çağrıldığında çalışmayabilir .
Şöyle görünecektir:
VARIABLE=$(/some/command);
if [[ $VARIABLE == 0 ]]; then
# some action
fi
Komutunuz bunun gibi çift köşeli parantez içeriyorsa ve günlüklerde hata alıyorsanız, ancak konsoldan çalışıyorsa, [[burada önerilen bir alternatifi değiştirmeyi deneyin veya betiğinizi çalıştıran her şeyin [[aka destekleyen bir kabuk kullandığından emin olun new test.
Ayrıca [: unary operator expectedhataya dikkat edin
"Çok fazla argüman" hatası görüyorsanız, öngörülemeyen çıktıya sahip bir işlevden bir dize alıyorsunuzdur. Boş bir dize (veya tüm boşluk dizesi) almak da mümkünse , bu yukarıdaki "hızlı düzeltme" ile bile sıfır bağımsız değişken olarak ele alınır ve başarısız olur[: unary operator expected
Diğer dillere alışkınsanız aynı 'gotcha' - bir değişkenin içeriğinin, değerlendirilmeden önce böyle bir koda etkili bir şekilde basılmasını beklemezsiniz.
İşte bir örnek olduğunu önler hem [: too many argumentsve [: unary operator expectedhatalar: Bu boşsa (bu örnekte varsayılan bir değerle çıktı yerine 0her şeyi sarılı çift tırnak ile,):
VARIABLE=$(/some/command);
if [ "${VARIABLE:-0}" == 0 ]; then
# some action
fi
(burada, $ VARIABLE 0 veya boşsa eylem gerçekleşir. Doğal olarak, farklı davranışlar isteniyorsa 0'ı (varsayılan değer) farklı bir varsayılan değere değiştirmelisiniz)
Son Not: beri [için bir kısayol testtüm yukarıda da hata için de geçerlidir test: too many arguments(aynı zamanda ve test: unary operator expected)