Cara melakukan operasi ATAU logis dalam skrip shell

571

Saya mencoba melakukan pemeriksaan kondisi sederhana, tetapi sepertinya tidak berhasil.

Jika $#sama dengan 0atau lebih besar dari 1maka katakan halo.

Saya telah mencoba sintaks berikut ini tanpa hasil:

if [ "$#" == 0 -o "$#" > 1 ] ; then
 echo "hello"
fi

if [ "$#" == 0 ] || [ "$#" > 1 ] ; then
 echo "hello"
fi
Stroberi
sumber
Mereka berdua bekerja untukku. Apakah Anda menentukan shell di garis shebang ?
Jason McCreary
1
@ Alasan saya benar-benar lupa garis shebang, tapi saya mengujinya dengan itu sekarang dan itu tidak berhasil.
Strawberry
25
>adalah redirection output di sh / bash. Sekarang Anda mungkin memiliki file dengan nama 1.
mark4o
Untuk informasi tentang perbandingan Bash, silakan lihat jawaban saya untuk pertanyaan sebelumnya di sini dan di sini . Untuk informasi tambahan tentang kurung, kurung ganda dan kurung ganda, lihat jawaban saya di sini .
Dijeda sampai pemberitahuan lebih lanjut.
Tidak berfungsi karena Anda salah mengetik kompraison: gunakan "$ #" == "0" atau $ # -eq 0
ETech

Jawaban:

987

Ini seharusnya bekerja:

#!/bin/bash

if [ "$#" -eq 0 ] || [ "$#" -gt 1 ] ; then
    echo "hello"
fi

Saya tidak yakin apakah ini berbeda di shell lain tetapi jika Anda ingin menggunakan <,>, Anda harus meletakkannya di dalam tanda kurung ganda seperti:

if (("$#" > 1))
 ...
Distrik Coding
sumber
2
Saya tidak yakin apakah itu berbeda di shell lain tetapi di bash, jika Anda ingin menggunakan> atau <, Anda harus meletakkannya dalam tanda kurung ganda seperti: (("$ a" <"$ b"))
Pengkodean District
1
@ Doug: Bukannya unix tidak menggunakannya, itu bash dan semua shell yang saya tahu menggunakannya untuk pengalihan input / output.
Cascabel
56

Kode ini berfungsi untuk saya:

#!/bin/sh

argc=$#
echo $argc
if [ $argc -eq 0 -o $argc -eq 1 ]; then
  echo "foo"
else
  echo "bar"
fi

Saya tidak berpikir dia mendukung "==". Gunakan "=" untuk membandingkan string dan -eq untuk membandingkan int.

man test

untuk lebih jelasnya.

jbremnant
sumber
Apa pilihan untuk lebih dari? Di mana dokumentasi resmi untuk tih?
Strawberry
3
Seharusnya lebih -gtbesar dari. Atau ganti saja semuanya dengan [ $# -ne 1 ].
mark4o
Lebih besar dari -gt, lihat jawaban saya. Dokumentasi resmi sedang dalam uji man seperti yang ditunjukkan jbremnant.
Coding District
Sama seperti fyi untuk orang lain, tergantung pada shell Anda, sebagian besar dukungan == (sekarang menjadi hari) sebagai operator perbandingan, namun sebagian besar waktu itu sama dengan operator =. Saya akan membayangkan bahwa jika Anda menggunakan -gt dan -ne untuk perbandingan, akan lebih baik menggunakan -eq untuk == atau = untuk menjaga gaya skrip Anda konsisten. Selamat Bashing :)
jkdba
34

Jika Anda menggunakan status kode keluar bash $? sebagai variabel, lebih baik melakukan ini:

if [ $? -eq 4 -o $? -eq 8 ] ; then  
   echo "..."
fi

Karena jika Anda melakukannya:

if [ $? -eq 4 ] || [ $? -eq 8 ] ; then  

Bagian kiri OR mengubah $? variabel, jadi bagian kanan OR tidak memiliki $ asli ? nilai.

luca76
sumber
2
$ # mengembalikan jumlah argumen yang diteruskan ke skrip. Berguna untuk memeriksa penggunaan yang benar. Sepertinya penanya tidak menggunakan kode keluar.
Centimane
27

Terkadang Anda perlu menggunakan tanda kurung ganda, jika tidak Anda mendapatkan kesalahan seperti terlalu banyak argumen

if [[ $OUTMERGE == *"fatal"* ]] || [[ $OUTMERGE == *"Aborting"* ]]
  then
fi
TechNikh
sumber
1
Ini berguna karena ini satu-satunya hal di sini yang saya lihat menunjukkan contoh perbandingan non-integer, yang sedikit berbeda dalam sintaksis.
Christopher Hunter
13

Jika skrip bash

If [[ $input -gt number  ||  $input  -lt number  ]]
then 
    echo .........
else
    echo .........

fi

exit
Peprah David
sumber
7

pernahkah Anda mencoba sesuatu seperti ini:

if [ $# -eq 0 ] || [ $# -gt 1 ] 
then
 echo "$#"
fi
John Boker
sumber
Ya saya punya. Ini echohalo bahkan ketika saya memiliki satu argumen.
Strawberry
Yang kedua $#mungkin nilai pengembalian tes pertama?
luckydonald
5

Dari Manual Referensi Bash → 3.4.2 Parameter Khusus

#
($ #) Memperluas jumlah parameter posisi dalam desimal.

Oleh karena itu, $#akan selalu berupa 0 atau bilangan bulat yang lebih besar.

Jadi jika Anda ingin melakukan sesuatu setiap kali $#0 atau lebih besar dari 1, Anda hanya perlu memeriksa apakah $#ada atau tidak 1:

[ $# -eq 1 ] && echo "1 positional param" || echo "0 or more than 1"

Ini menggunakan sintaks:

[ condition ] && {things if true} || {things if false}
fedorqui 'SO berhenti merugikan'
sumber
di bash kamu bisa melakukan sesuatu seperti:[[ -n $A ]] && echo 1 || echo 2
premek.v
@ premek.v terima kasih atas komentarnya. Jawaban saya sangat buruk dijelaskan, saya baru saja mengeditnya dengan harapan bahwa hal itu memberi lebih banyak cahaya pada topik.
fedorqui 'SO stop harming'
1

Dan di Bash

 line1=`tail -3 /opt/Scripts/wowzaDataSync.log | grep "AmazonHttpClient" | head -1`
 vpid=`ps -ef|  grep wowzaDataSync | grep -v grep  | awk '{print $2}'`
 echo "-------->"${line1}
    if [ -z $line1 ] && [ ! -z $vpid ]
    then
            echo `date --date "NOW" +%Y-%m-%d` `date --date "NOW" +%H:%M:%S` :: 
            "Process Is Working Fine"
    else
            echo `date --date "NOW" +%Y-%m-%d` `date --date "NOW" +%H:%M:%S` :: 
            "Prcess Hanging Due To Exception With PID :"${pid}
   fi

ATAU dalam Bash

line1=`tail -3 /opt/Scripts/wowzaDataSync.log | grep "AmazonHttpClient" | head -1`
vpid=`ps -ef|  grep wowzaDataSync | grep -v grep  | awk '{print $2}'`
echo "-------->"${line1}
   if [ -z $line1 ] || [ ! -z $vpid ]
    then
            echo `date --date "NOW" +%Y-%m-%d` `date --date "NOW" +%H:%M:%S` :: 
            "Process Is Working Fine"
    else
            echo `date --date "NOW" +%Y-%m-%d` `date --date "NOW" +%H:%M:%S` :: 
            "Prcess Hanging Due To Exception With PID :"${pid}
  fi
Ravi Tyagi
sumber