Cevabın eski versiyonu için bu cevabın ikinci kısmına bakınız. Ayrıntıları bilmek istiyorsanız, okumaya devam edin.
Sorunun nedeni
Sorunun kendisinde, OP'nin too many arguments errortest edildiğinde durum bashböyle görünmediğini gördüğü bildirildi :
$ [ $1 != '' ] && [ $2 != '' ]
bash: [: !=: unary operator expected
İle /bin/shhangi aslında sembolik olarak bir /bin/dashaşağıdaki gibi Ubuntu, hata bildirdi:
$ sh
$ [ $1 != '' ] && [ $2 != '' ]
sh: 1: [: !=: unexpected operator
Ve bağımsız /bin/testda:
$ /usr/bin/test $1 != ''
/usr/bin/test: missing argument after ‘’
Sidenote: Eğer ne olduğunu merak ediyorsanız /usr/bin/testve neden kullanıyorum bashve sho zaman bilmelidir ki, [için diğer adıdır testaynı zamanda bağımsız çalıştırılabilir ya da daha yaygın olarak var komutu - kabuk olarak yerleşik olan her kabuk ilk kullanacak budur . ifİfadelere gelince , komutların çıkış heykelleri üzerinde çalışırlar, bu yüzden neden [ve testöyledirler, her şey o komutlara argüman olarak gelirler - bu komut satırı arglarının yanlış sıralanması hatalara yol açar.
Konuya geri dönelim: OP'nin ilgisiz hatanın nasıl oluştuğu belli değil. Ancak, her 3 durumda da sorun aynıdır - ayarlanamayan değişken boş olarak değerlendirilir, bu nedenle kabuğun bu alıntılanmamış değişkenlerle gördüğü
[ != '' ]
hangi testanlamaları sözdizimini kırar . Hatalı komut satırı argümanları hakkında söylediklerimi hatırlıyor musun? Bu yüzden neden alıntı yapmak önemlidir? Tanısal çıktıyı etkinleştirelim ve hangi kabuğun çalıştığını görelim:
$ set -x
# throws error
$ [ $1 != '' ] && [ $2 != '' ]
+ '[' '!=' '' ']'
bash: [: !=: unary operator expected
# no error
$ [ "$1" != '' ] && [ "$2" != '' ] || echo null vars
+ '[' '' '!=' '' ']'
+ echo null vars
null vars
Değişmeyen değişkenleri test etmenin daha iyi yolu
Çevresinde gördüğünüz çok sık bir yaklaşım şudur:
if [ "x$var1" == "x" ] && [ "x$var2" == "x" ];
then
echo "both variables are null"
fi
Gilles'dan alıntı yapmak için :
["X $ 1" = "x"] 'de, x öneki x "$ 1"' in bir operatör gibi görünmemesini sağlar ve böylece kabuğun bu testi ayrıştırmasının tek yolu = ikili operatör olarak davranmaktır.
Muhtemelen, bunları /bin/shsenaryolarda gördüğümden beri oldukça taşınabilir olmalı . Aynı zamanda olduğu gibi birleştirilebilir
if [ "x${var1}${var2}" == "x" ]; then
...
fi
Elbette -zbayrak kullanabiliriz , ancak bazı kabukları araştırmaya göre, özellikle ksh88'i ( Stephane Chazelas'a göre ), bu bayrak hatalı.
Ayrıca bakınız