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.