Galat "unary operator expected" di Bash jika kondisinya

225

Saya sudah mencoba mencari tahu apa yang salah dengan ini tetapi tidak bisa mengetahuinya ..

Ini bagian yang sepertinya mendapat error ..

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

Saya mendapatkan kesalahan ini:

calc_1.2: line 75: [: =: unary operator expected
Jordanss10
sumber
4
Saya pikir ifpernyataan Anda pada saluran 75 perlu a fi.
Steve
7
Jika ragu, kutip vars.
koola
9
@koola, 'selalu' mengutip vars.
CousinCocaine

Jawaban:

480

Jika Anda tahu Anda akan selalu menggunakan bash, jauh lebih mudah untuk selalu menggunakan perintah compound conditional double bracket [[ ... ]], daripada versi braket tunggal yang kompatibel dengan Posix [ ... ]. Di dalam [[ ... ]]kata majemuk, pemisahan kata dan perluasan nama path tidak diterapkan pada kata-kata, jadi Anda bisa mengandalkannya

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

untuk membandingkan nilai $aug1dengan string and.

Jika Anda menggunakan [ ... ], Anda harus selalu ingat untuk menggandakan variabel kutipan seperti ini:

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

Jika Anda tidak mengutip ekspansi variabel dan variabel tidak terdefinisi atau kosong, variabel akan menghilang dari lokasi kejahatan, hanya menyisakan

if [ = "and" ]; 

yang bukan sintaks yang valid. (Itu juga akan gagal dengan pesan kesalahan yang berbeda jika $aug1termasuk spasi putih atau karakter meta shell.)

[[Operator modern memiliki banyak fitur bagus lainnya, termasuk pencocokan ekspresi reguler.

rici
sumber
9
"modern"? Bukankah [[ selalu di bash? Sudah di shell Korn selama lebih dari dua puluh tahun, dan pra-tanggal pesta. (Saya tahu apa yang Anda maksudkan)
cdarke
31

Butuh waktu beberapa saat untuk menemukan ini tetapi perhatikan bahwa jika Anda memiliki kesalahan spasi Anda juga akan mendapatkan kesalahan yang sama:

[: =: unary operator expected

Benar:

if [ "$APP_ENV" = "staging" ]

vs.

if ["$APP_ENV" = "staging" ]

Seperti biasa mengatur -xvariabel debug membantu menemukan ini:

set -x
Juha Vehnia
sumber
Seseorang mewariskan bug ini kepada saya dalam skrip build. Menghemat waktu saya, terima kasih!
Kyle
8

Coba tetapkan nilai $aug1sebelum menggunakannya dalam if[]laporan; pesan kesalahan akan hilang setelahnya.

yilee
sumber
0

Kamu bilang ... :

elif [$ operation = "man"]; maka jika [$ aug1 = "add"]; lalu # <- Baris 75 echo "Man Page for: add" echo "" echo "Sintaks: tambahkan [nomor 1] [nomor 2]" echo "" echo "Deskripsi:" echo "Tambahkan dua angka berbeda bersamaan." echo "" echo "Info:" echo "Ditambahkan dalam v1.0" echo "" elif [-z $ aug1]; lalu gema "Silakan tentukan perintah untuk membaca halaman manual." else echo "Tidak ada halaman manual untuk perintah itu." fi

Saya pikir ini hanya ruang ... lakukan seperti ini:

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
Renan Moura
sumber
-11

Anda juga dapat menetapkan nilai default untuk variabel, jadi Anda tidak perlu menggunakan dua "[", yang berarti dua proses ("[" sebenarnya adalah sebuah program) alih-alih satu.

Itu berjalan dengan sintaks ini: $ {VARIABLE: -default}.

Semuanya harus dipikirkan sedemikian rupa sehingga nilai "default" ini adalah sesuatu yang berbeda dari nilai / konten "valid".

Jika itu tidak mungkin karena alasan tertentu Anda mungkin perlu menambahkan langkah seperti memeriksa apakah ada nilai sama sekali, di sepanjang baris "jika [-z $ VARIABEL]; kemudian gema" variabel perlu diisi "", atau " jika [! -z $ VARIABLE]; maka # semuanya baik-baik saja, lanjutkan dengan sisa skrip ".

el guesto
sumber
3
[[tidak memunculkan dua proses, itu adalah builtin shell (dan [juga Bash builtin). [[berbeda dari [ [, yang memperlakukan yang kedua [sebagai string
user123444555621