Koşul durumunda Bash'de “tekli operatör bekleniyor” hatası


225

Bu konuda neyin yanlış olduğunu anlamaya çalışıyorum ama anlayamıyorum ..

Bu kısmı bir hata alıyor gibi görünüyor ..

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

Bu hatayı alıyorum:

calc_1.2: line 75: [: =: unary operator expected

4
Sanırım if75. satırdaki açıklamanızın a fi.
Steve

7
Şüpheniz varsa, teklif değişir.
koola

9
@ koola, 'her zaman' alıntı vars.
CousinCocaine

Yanıtlar:


480

Her zaman bash kullanacağınızı biliyorsanız [[ ... ]], Posix uyumlu tek parantez sürümü yerine her zaman çift parantez koşullu bileşik komutunu kullanmak çok daha kolaydır [ ... ]. Bir [[ ... ]]bileşiğin içinde sözcük bölme ve yol adı genişletme sözcüklere uygulanmaz, böylece

if [[ $aug1 == "and" ]];

değerini $aug1dizeyle karşılaştırmak için and.

Eğer kullanırsanız [ ... ], daima aşağıdaki gibi değişkenleri iki katına çıkarmayı unutmayın:

if [ "$aug1" = "and" ];

Değişken genişlemeyi teklif etmezseniz ve değişken tanımsız veya boşsa, suç mahallinden kaybolur ve yalnızca

if [ = "and" ]; 

geçerli bir sözdizimi değildir. ( $aug1Boşluk veya kabuk metakarakterleri dahil edilirse farklı bir hata iletisiyle de başarısız olur .)

Modern [[operatör, düzenli ifade eşleştirme de dahil olmak üzere diğer birçok güzel özelliğe sahiptir.


9
"modern"? [[ Her zaman bash'ta olmadı mı? Yirmi yılı aşkın bir süredir Korn kabuğunda ve bash'dan önce. (Ne demek istediğini biliyorum)
cdarke

31

Bunu bulmak için bana biraz zaman aldı ama bir boşluk hatası varsa aynı hatayı alacağınızı unutmayın:

[: =: unary operator expected

Doğru:

if [ "$APP_ENV" = "staging" ]

vs

if ["$APP_ENV" = "staging" ]

Her zaman olduğu gibi -xhata ayıklama değişkenini ayarlamak bunları bulmanıza yardımcı olur:

set -x

Birisi bir derleme betiğinde bana bu hatayı miras bıraktı. Beni biraz kurtardı, teşekkürler!
Kyle

8

İfadelerde $aug1kullanmadan önce bir değer atamayı deneyin if[]; hata mesajı daha sonra kaybolacaktır.


0

diyorsun ... :

elif [$ işlem = "adam"]; o zaman [$ aug1 = "add"] ise; sonra # <- Satır 75 echo "Man Page for:" echo "" echo "Sözdizimi: add [sayı 1] [sayı 2]" echo "" echo "Açıklama:" echo "Birlikte iki farklı sayı ekleyin." echo "" echo "Bilgi:" echo "v1.0" echo "" içine eklendi elif [-z $ aug1]; sonra echo "Lütfen kılavuz sayfasını okumak için bir komut belirtin." else echo "Bu komut için manuel sayfa yok." fi

Bence bu sadece alan ... böyle yapmak:

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

-11

Değişken için varsayılan bir değer de ayarlayabilirsiniz. Bu nedenle, iki işlem ("[" aslında bir programdır) yerine iki "[" kullanmanız gerekmez.

Şu sözdizimine göre yapılır: $ {VARIABLE: -default}.

Her şey, bu "varsayılan" değerin "geçerli" bir değer / içerikten farklı bir şey olacağı şekilde düşünülmelidir.

Herhangi bir nedenle bu mümkün değilse, muhtemelen "if [-z $ VARIABLE] satırları boyunca bir değer olup olmadığını kontrol etmek gibi bir adım eklemeniz gerekir; o zaman" değişkenin doldurulması gerekir "" veya " [! -z $ VARIABLE]; # # her şey yolundaysa, komut dosyasının geri kalanıyla devam edin ".


3
[[iki süreç üretmiyor, bir kabuk yerleşimi (ve [bir Bash yerleşimi). [[farklıdır [ [ikinci davranır ki, [bir dizi olarak
user123444555621
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.