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?