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.