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

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))
 ...

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.


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.


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

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

7

pernahkah Anda mencoba sesuatu seperti ini:

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

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}

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.