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 error
test edildiğinde durum bash
böyle görünmediğini gördüğü bildirildi :
$ [ $1 != '' ] && [ $2 != '' ]
bash: [: !=: unary operator expected
İle /bin/sh
hangi aslında sembolik olarak bir /bin/dash
aşağıdaki gibi Ubuntu, hata bildirdi:
$ sh
$ [ $1 != '' ] && [ $2 != '' ]
sh: 1: [: !=: unexpected operator
Ve bağımsız /bin/test
da:
$ /usr/bin/test $1 != ''
/usr/bin/test: missing argument after ‘’
Sidenote: Eğer ne olduğunu merak ediyorsanız /usr/bin/test
ve neden kullanıyorum bash
ve sh
o zaman bilmelidir ki, [
için diğer adıdır test
aynı 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 test
anlamaları 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/sh
senaryolarda gördüğümden beri oldukça taşınabilir olmalı . Aynı zamanda olduğu gibi birleştirilebilir
if [ "x${var1}${var2}" == "x" ]; then
...
fi
Elbette -z
bayrak 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