GNU/Linux >> Belajar Linux >  >> Linux

Periksa Apakah $reply Berada Dalam Rentang Angka?

Saya sedang menulis skrip shell untuk Linux, menggunakan Bash, untuk menerjemahkan file video apa pun menjadi MP4. Untuk itu, saya menggunakan avconv dengan libvorbis untuk audio.

Di dalam skrip saya, saya punya pertanyaan untuk pengguna :

read -p "- Audio Quality [scale from -2 to 10] ? "
    if [ -n "$REPLY" ] ; then
    ABITRATE="-aq $REPLY"
    fi

String “ABITRATE” saya masuk ke avconv terakhir baris perintah.

Tetapi saya ingin memberikan kesempatan kepada pengguna untuk menjawab pertanyaan itu dengan nilai dalam Kb (Kilobit), dan menerjemahkannya ke dalam skala yang libvorbis menggunakan.
"Skala dari -2 hingga 10" adalah ini :

Quality Kbit/s  Normalization
-----------------------------
 -2      ~32        y
 -1      ~48        y
  0      ~64        y
  1      ~80        y
  2      ~96        y
  3     ~112        y
  4     ~128        n
  5     ~160        n
  6     ~192        n
  7     ~224        n
  8     ~256        n
  9     ~320        n
 10     ~500        n

Saya ingin tahu cara memeriksa apakah $REPLY saya berada dalam kisaran angka. Misalnya, saya ingin skrip saya melakukan sesuatu seperti ini :

if [ $REPLY is a number between 1 and 32 ] ; then 
 REPLY="-2"
elif [ $REPLY is a number between 33 and 48 ] ; then 
 REPLY="-1"
fi

Apakah ini mungkin (saya bersedia mengatakan 'ya tentu saja, seharusnya tidak sulit' tetapi saya tidak tahu sintaks yang digunakan) ?

Jawaban yang Diterima:

[ command/shell builtin memiliki tes perbandingan, jadi Anda bisa melakukannya

if [ "$REPLY" -ge 1 ] && [ "$REPLY" -le 32 ]; then REPLY=-2;
elif [ "$REPLY" -ge 33 ] && [ "$REPLY" -le 48 ]; then REPLY=-1; fi

di mana -ge berarti lebih besar-atau-sama-dengan (dan seterusnya). [ command hanyalah sebuah perintah, bukan sintaks khusus (sebenarnya sama dengan test :lihat man test ), jadi MEMBUTUHKAN spasi setelahnya. Jika Anda menulis [$REPLY ia akan mencoba menemukan perintah bernama [$REPLY dan jalankan, yang tidak akan berhasil. Hal yang sama berlaku untuk menutup ] .

Di sini, kami menggunakan && operator shell untuk menjalankan perintah kedua hanya jika yang pertama berhasil. [ juga mendukung -a untuk dan dua pengujian, tetapi sudah tidak digunakan lagi dan penggunaannya harus dihindari karena menyebabkan argumen tidak dapat diuraikan dengan andal.

Sunting:untuk menguji apakah angkanya bilangan bulat (jika itu bisa terjadi dalam kode Anda), lakukan tes terlebih dahulu

if [[ "$REPLY" =~ ^[0-9]+$ ]]; then
   existing code
else echo "$REPLY is not an integer" >&2 && exit 1; fi

Tentu saja semua ekspresi braket ini mengembalikan 0 (benar) atau 1 (salah) dan dapat digabungkan. Tidak hanya Anda dapat menempatkan semuanya di braket yang sama, Anda juga dapat melakukannya

if [[ "$REPLY" =~ ^[0-9]+$ ]] && [ "$REPLY" -ge 1 ] && [ "$REPLY" -le 32 ]; then ...

atau yang serupa.

Terkait:Dhcpd:cara apa saja untuk memeriksa status kumpulan dhcp?
Linux
  1. Cara memeriksa versi Redhat

  2. Cara Memeriksa Zona Waktu di Linux

  3. Bagaimana cara memeriksa sintaks sudoers

  1. Periksa database untuk korupsi

  2. Cara Memeriksa Versi CentOS

  3. Pindahkan berbagai file bernomor?

  1. Cara Memeriksa Ruang Disk di Linux

  2. Periksa Versi AlmaLinux

  3. jumlahkan semua angka dari du