Verifikasi panjang variabel

27

Saya harus memverifikasi panjang variabel yang dibaca (batas skrip saya hingga lima karakter yang dimasukkan), saya memikirkan sesuatu seperti ini:

#!/bin/bash
read string
check=${#string}
echo $check
if [ $check -ge 5 ]; then echo "error" ; exit
else echo "done"
fi

apakah ada solusi yang lebih "elegan"?

Pol Hallen
sumber
1
Script Anda berfungsi dengan benar dalam POSIX standar /bin/sh. Anda harus mempertimbangkan untuk mengubah garis shebang #!/bin/shsehingga akan lebih portabel dan berjalan di lingkungan di mana bash tidak tersedia. Plus, /bin/shmungkin shell yang lebih ringan seperti dasbor yang tidak dibebani dengan fitur yang dimaksudkan untuk penggunaan interaktif.
Celada
@Celada, meskipun benar dalam kasus ini, dash's ${#string}akan memberikan panjang di jumlah byte bukan karakter.
Stéphane Chazelas

Jawaban:

43

Lebih elegan? Tidak

Singkat? Iya nih :)

#!/bin/bash
read string
if [ ${#string} -ge 5 ]; then echo "error" ; exit
else echo "done"
fi

Dan jika Anda tidak memiliki masalah dalam memperdagangkan lebih banyak keanggunan dengan tujuan menjadi lebih pendek, Anda dapat memiliki skrip dengan 2 baris lebih sedikit:

#!/bin/bash
read string
[ ${#string} -ge 5 ] && echo "error" || echo "done"

Anda bisa menggunakan kurung ganda jika Anda pikir itu lebih aman. Penjelasan di sini .


sumber
3

Alternatif Bourne-kompatibel ( ${#string}POSIX tetapi bukan Bourne (bukan bahwa Anda mungkin pernah menemukan shell Bourne hari ini)):

case $string in
  ?????*) echo >&2 Too long; exit 1;;
       *) echo OK
esac

Perhatikan bahwa untuk keduanya ${#string}dan ????, apakah itu jumlah byte atau karakter akan tergantung pada shell. Umumnya (dan itu diperlukan oleh POSIX), itu adalah jumlah karakter. Tetapi untuk beberapa shell seperti dashitu tidak sadar multi-byte, itu akan menjadi byte sebagai gantinya.

Dengan mksh, Anda perlu set -o utf8-mode(di lokal UTF-8) agar dapat memahami karakter multi-byte:

$ string=€€€ bash -c 'echo "${#string}"'
3
$ string=€€€ dash -c 'echo "${#string}"'
9
$ string=€€€ mksh -c 'echo "${#string}"'
9
$ string=€€€ mksh -o utf8-mode -c 'echo "${#string}"'
3
$ locale charmap
UTF-8
Stéphane Chazelas
sumber
di luar topik, tetapi echo Too longberbeda di bawah tenda dariecho 'Too long'
Steven Penny
Dan, jika Anda hanya akan mencetak ketika "terlalu lama", saya dapat memadatkan lebih banyak lagi pada ifpilihan saya :)
2
@StevenPenny, echo Too longmeneruskan dua argumen ( Toodan long) echoyang echokeluarannya dipisahkan oleh spasi (dan diikuti oleh baris baru), sementara di echo 'Too long', kami meneruskan satu Too longargumen echoyang ditampilkan berikut oleh baris baru. Jadi itu setara dengan functionnaly.
Stéphane Chazelas