Saya sedang menulis skrip shell untuk Linux, menggunakan Bash, untuk menerjemahkan file video apa saja ke dalam 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 baris avconv
perintah terakhir .
Tapi saya ingin memberi pengguna kesempatan untuk menjawab pertanyaan itu dengan nilai dalam Kb (Kilobit), dan menerjemahkannya ke skala yang libvorbis
digunakan. "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 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)?
sumber
Jawaban:
The
[
perintah / shell builtin memiliki tes perbandingan, sehingga Anda hanya dapat melakukandi mana
-ge
berarti lebih besar atau sama dengan (dan seterusnya). Ini-a
logis "dan". The[
perintah hanya perintah, tidak sintaks khusus (itu sebenarnya sama sepertitest
: memeriksaman test
), sehingga KEBUTUHAN ruang setelah. Jika Anda menulisnya[$REPLY
akan mencoba menemukan perintah bernama[$REPLY
dan menjalankannya, yang tidak akan berhasil. Hal yang sama berlaku untuk penutupan]
.Sunting: untuk menguji apakah angka itu bilangan bulat (jika itu bisa terjadi dalam kode Anda), pertama-tama lakukan tes
Tentu saja semua ekspresi kurung ini menghasilkan 0 (benar) atau 1 (salah) dan dapat digabungkan. Tidak hanya Anda dapat meletakkan semuanya di braket yang sama, Anda juga dapat melakukannya
atau yang serupa.
sumber
>=
?[
tanda kurung tradisional ini , yang berfungsi seperti yang terlihat diman test
. Ini tradisional dan bukti bodoh. Kemudian, Anda memiliki banyak bash bawaan. Anda memiliki[[
yang serupa, tetapi tidak persis sama, karena yang ini tidak memperluas nama path (di sana, <=> perbandingan string rata-rata, dan perbandingan integer sama dengan di[
). Keduanya juga memiliki banyak tes untuk keberadaan file, izin dan sebagainya. Maka Anda memiliki satu(
dan dua kali((
digunakan dalam jawaban @ devnull. Lihat diman bash
bawahCompound Commands
.foo='a'; [[ "$foo" -lt 32 ]] && echo yes
Anda bisa mengatakan:
Mengutip dari manual :
sumber
((
? Saya mencoba menggunakannya dengan cepat dan sepertinya berfungsi sepertiif [ ] ; then
tetapi saya tidak tahu itu ada.if [ condition ]; then foo; fi
setara dengan mengatakancondition && foo
.a=08; (( a > 1 ))
akan kesalahan sejak 08 dianggap oktal. Anda juga bisa memaksa desimal dengan10#$REPLY
.cmd && cmd
tidak sama denganif cmd; then ...
Sekali Anda membutuhkanelse
bagian, merantai logis&&
dan||
dapat menyebabkan bug halus.Anda dapat melakukan sesuatu seperti ini:
sumber
Pertama, uji apakah inputnya numerik. Misalnya, menggunakan operator pencocokan ekspresi reguler dari ekspresi kondisional bash :
Untuk menguji rentang angka, Anda memiliki dua kemungkinan:
-gt
operator ekspresi kondisional dalam[ … ]
atau[[ … ]]
(berhati-hatilah bahwa<
dan>
operator melakukan perbandingan string, bukan numerik nilai perbandingan, sehingga[[ 10 < 9 ]]
benar);((…))
.Demikian:
(Anda mungkin ingin menggunakan aturan pendekatan yang berbeda, saya tidak tahu apakah yang saya pilih adalah yang terbaik di sini.)
sumber
Untuk mendeteksi dengan benar jika suatu string adalah angka (desimal), pertama-tama kita perlu mendefinisikan apa itu bilangan bulat desimal. Definisi yang sederhana namun cukup lengkap adalah:
Dan langkah-langkah ini diperlukan:
Hanya satu regex yang akan melakukan sebagian besar itu:
Kode untuk memproses beberapa angka adalah:
Yang akan dicetak:
Setelah angka tersebut bersih dan jelas, satu-satunya tes yang hilang adalah membatasi rentang nilai. Beberapa baris sederhana ini akan melakukan itu:
sumber