Bagaimana saya dapat mempersingkat skrip shell ini?
CODE="A"
if test "$CODE" = "A"
then
PN="com.tencent.ig"
elif test "$CODE" = "a"
then
PN="com.tencent.ig"
elif test "$CODE" = "B"
then
PN="com.vng.pubgmobile"
elif test "$CODE" = "b"
then
PN="com.vng.pubgmobile"
elif test "$CODE" = "C"
then
PN="com.pubg.krmobile"
elif test "$CODE" = "c"
then
PN="com.pubg.krmobile"
elif test "$CODE" = "D"
then
PN="com.rekoo.pubgm"
elif test "$CODE" = "d"
then
PN="com.rekoo.pubgm"
else
echo -e "\a\t ERROR!"
echo -e "\a\t CODE KOSONG"
echo -e "\a\t MELAKUKAN EXIT OTOMATIS"
exit
fi
shell-script
IISomeOneII
sumber
sumber
bash
kode? Atau apakah Anda memiliki shell lain dalam pikiran?example.org
,example.net
dll, karena domain ini secara khusus dicadangkan untuk tujuan ini di RFC 2606 dan tidak akan pernah digunakan untuk entitas nyata.Jawaban:
Gunakan
case
pernyataan (portabel, bekerja dish
shell-like):Saya juga merekomendasikan mengubah nama variabel Anda dari semua huruf besar (seperti
CODE
) ke huruf kecil atau campuran (sukacode
atauCode
). Ada banyak nama all-caps yang memiliki arti khusus, dan menggunakan kembali salah satunya secara tidak sengaja dapat menyebabkan masalah.Catatan lain: Konvensi standar adalah untuk mengirim pesan kesalahan ke "kesalahan standar" daripada "output standar"; yang
>&2
redirect melakukan hal ini. Selain itu, jika skrip (atau program) gagal, sebaiknya keluar dengan status bukan nol (exit 1
), sehingga konteks panggilan apa pun dapat mengetahui apa yang salah. Ini juga mungkin untuk menggunakan status yang berbeda untuk menunjukkan masalah yang berbeda (lihat "KODE EXIT" bagian dari satucurl
halaman manual untuk contoh yang baik). (Penghargaan untuk Stéphane Chazelas dan Monty Harder untuk saran di sini.)Saya sarankan
printf
daripadaecho -e
(danecho -n
), karena ini lebih portabel antara OS, versi, pengaturan, dll. Saya pernah punya banyak skrip saya karena pembaruan OS termasuk versi bash yang dikompilasi dengan berbagai opsi, yang mengubah caraecho
berperilaku.Kutipan ganda di sekitar
$CODE
tidak benar-benar diperlukan di sini. String dalam acase
adalah salah satu dari beberapa konteks di mana aman untuk membiarkannya. Namun, saya lebih suka untuk mengutip variabel referensi kecuali ada alasan khusus untuk tidak melakukannya, karena sulit untuk melacak di mana itu aman dan di mana tidak, jadi lebih aman untuk hanya membiasakan mengutipnya secara umum.sumber
*
(dan mencetak kesalahan) - polanya[aA]
cocok dengan "a" atau "A", tetapi tidak keduanya sekaligus.readonly Exit_BadCode=1
sehingga bisa dikatakanexit $Exit_BadCode
sebaliknya.case "${CODE,}" in
, sehingga masing-masing kondisional menjadi sederhanaa)
,b)
dll.$CODE
. Saya selalu memanggil "status keluar" persis seperti itu, tidak pernah hanya "kode". Jika skrip perlu menggunakan ratusan kunci untuk merujuk ke string, menggunakancase
pernyataan menjadi sulit.Dengan asumsi Anda menggunakan
bash
rilis 4.0 atau lebih baru ...Dalam kode tersebut, saya mendefinisikan array asosiatif yang berisi semua nama domain, masing-masing terkait dengan satu huruf kecil.
The
$PN
variabel ditugaskan nama domain yang sesuai dengan rendah-cased$CODE
nilai (${CODE,,}
return nilai$CODE
berubah menjadi huruf kecil saja) dari array ini, tetapi jika$CODE
tidak sesuai dengan entri yang valid dalamdomain
daftar, ia keluar script dengan kesalahan.The
${variable:?error message}
substitusi parameter akan memperluas untuk nilai$variable
(domain yang sesuai dalam kode) tapi akan keluar script dengan pesan kesalahan jika nilai kosong tidak tersedia. Anda tidak mendapatkan format pesan kesalahan yang sama persis seperti dalam kode Anda, tetapi pada dasarnya akan berperilaku sama jika$CODE
tidak valid:Jika Anda peduli dengan jumlah karakter, kami dapat mempersingkat ini lebih lanjut:
Selain menghapus baris baru yang tidak perlu, saya juga menghapus
com.
dari setiap domain (ini malah ditambahkan dalam penugasan kePN
).Perhatikan bahwa semua kode di atas akan berfungsi bahkan untuk nilai multi-karakter di
$CODE
(jika ada kunci yang lebih rendah untuk ini dalamdomain
array).Jika
$CODE
bukan indeks numerik (berbasis nol), ini akan menyederhanakan kode sedikit:Ini juga akan membuatnya sangat mudah untuk membaca
domain
array dari file tambahan yang mengandung satu entri per baris:sumber
declare -A domain
hanya mengatakan bahwa itudomain
harus menjadi variabel asosiatif array ("hash").$CODE
.$CODE
tidak disetel atau kosong, tetapi itu akan tetap menghasilkan pesan kesalahan khusus yang benar setelah itu.Jika shell Anda mengizinkan array, jawaban terpendek harus seperti contoh ini di bash:
Itu dengan asumsi bahwa
$code
hanya bisa a, b, c atau d.Jika tidak, tambahkan tes seperti:
sumber
${var,}
mengubah huruf kecil karakter pertama${var}
. @IISomeOneII${var,}
tampaknya khusus untuk Bash. Saya pikir array asosiatif akan bekerja di ksh dan zsh jugaSaya akan mengambil jawaban ini ke arah yang berbeda. Alih-alih mengode data Anda ke dalam skrip, masukkan data itu ke file data terpisah, lalu gunakan kode untuk mencari file:
Memisahkan masalah ini memiliki beberapa manfaat:
look
untuk mencarinya secara biner secara efisien (daripada baris demi barisgrep
atauawk
)sumber
PN
agar diatur ke nilai yang benar.Anda menggunakan huruf untuk mengindeks nilai, jika Anda menggunakan angka, itu menjadi sesederhana:
Itu kode shell portabel, akan bekerja pada sebagian besar shell.
Untuk bash Anda dapat menggunakan:
pn=${!code}
, atau untuk bash / ksh / zsh penggunaan:pn=${@:code:1}
.surat
Jika Anda harus pengguna huruf (dari a ke z, atau A ke Z) mereka harus dikonversi ke indeks:
Dalam kode yang lebih panjang untuk memperjelas maksud dan makna setiap bagian:
Jika Anda perlu mengonversi ke nilai huruf kecil, gunakan:
$(( asciival & ~32 ))
(pastikan bahwa bit 6 dari nilai ascii tidak disetel).kode kesalahan
Output yang dicetak skrip Anda pada kesalahan cukup panjang (dan khususnya).
Cara paling serbaguna untuk menghadapinya adalah dengan mendefinisikan suatu fungsi:
Dan kemudian panggil fungsi itu dengan pesan spesifik yang Anda butuhkan.
Perhatikan bahwa nilai keluar yang dihasilkan diberikan oleh
exitcode
(contoh di sini adalah 27).Script lengkap (dengan pengecekan error) kemudian menjadi:
sumber