Sizin $VARIABLE
boşluk veya başka özel karakterler içeren bir dize ise ve tek köşeli parantez kullanılıyorsa (bu test
komut 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 test
komut için bir kısayoldur ).
Bu sadece bash (ve görünüşte korn ve zsh) olarak bulunur ve bu nedenle /bin/sh
vb. 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 expected
hataya 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 arguments
ve [: unary operator expected
hatalar: Bu boşsa (bu örnekte varsayılan bir değerle çıktı yerine 0
her ş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 test
tüm yukarıda da hata için de geçerlidir test: too many arguments
(aynı zamanda ve test: unary operator expected
)