Jawaban:
Selain jawaban yang benar dari fedorqui , saya ingin menunjukkan perbedaan antara panjang string dan panjang byte:
myvar='Généralités'
chrlen=${#myvar}
oLang=$LANG oLcAll=$LC_ALL
LANG=C LC_ALL=C
bytlen=${#myvar}
LANG=$oLang LC_ALL=$oLcAll
printf "%s is %d char len, but %d bytes len.\n" "${myvar}" $chrlen $bytlen
akan membuat:
Généralités is 11 char len, but 14 bytes len.
Anda bahkan dapat melihat chars yang tersimpan:
myvar='Généralités'
chrlen=${#myvar}
oLang=$LANG oLcAll=$LC_ALL
LANG=C LC_ALL=C
bytlen=${#myvar}
printf -v myreal "%q" "$myvar"
LANG=$oLang LC_ALL=$oLcAll
printf "%s has %d chars, %d bytes: (%s).\n" "${myvar}" $chrlen $bytlen "$myreal"
akan menjawab:
Généralités has 11 chars, 14 bytes: ($'G\303\251n\303\251ralit\303\251s').
Nota: Menurut komentar Isabell Cowan ini , saya telah menambahkan pengaturan untuk $LC_ALL
bersama dengan $LANG
.
Argumen berfungsi sama seperti variabel biasa
strLen() {
local bytlen sreal oLang=$LANG oLcAll=$LC_ALL
LANG=C LC_ALL=C
bytlen=${#1}
printf -v sreal %q "$1"
LANG=$oLang LC_ALL=$oLcAll
printf "String '%s' is %d bytes, but %d chars len: %s.\n" "$1" $bytlen ${#1} "$sreal"
}
akan berfungsi sebagai
strLen théorème
String 'théorème' is 10 bytes, but 8 chars len: $'th\303\251or\303\250me'
printf
Alat koreksi yang berguna :Jika kamu:
for string in Généralités Language Théorème Février "Left: ←" "Yin Yang ☯";do
printf " - %-14s is %2d char length\n" "'$string'" ${#string}
done
- 'Généralités' is 11 char length
- 'Language' is 8 char length
- 'Théorème' is 8 char length
- 'Février' is 7 char length
- 'Left: ←' is 7 char length
- 'Yin Yang ☯' is 10 char length
Tidak terlalu cantik ... Untuk ini, ada sedikit fungsi:
strU8DiffLen () {
local bytlen oLang=$LANG oLcAll=$LC_ALL
LANG=C LC_ALL=C
bytlen=${#1}
LANG=$oLang LC_ALL=$oLcAll
return $(( bytlen - ${#1} ))
}
Kemudian sekarang:
for string in Généralités Language Théorème Février "Left: ←" "Yin Yang ☯";do
strU8DiffLen "$string"
printf " - %-$((14+$?))s is %2d chars length, but uses %2d bytes\n" \
"'$string'" ${#string} $((${#string}+$?))
done
- 'Généralités' is 11 chars length, but uses 14 bytes
- 'Language' is 8 chars length, but uses 8 bytes
- 'Théorème' is 8 chars length, but uses 10 bytes
- 'Février' is 7 chars length, but uses 8 bytes
- 'Left: ←' is 7 chars length, but uses 9 bytes
- 'Yin Yang ☯' is 10 chars length, but uses 12 bytes
Tapi ada beberapa perilaku aneh UTF-8, seperti karakter spasi ganda, karakter spasi nol, penempatan terbalik, dan lainnya yang tidak semudah itu ...
Lihatlah diffU8test.sh atau difU8test.sh.txt untuk batasan lebih lanjut.
Untuk mendapatkan panjang string yang disimpan dalam variabel, katakan:
myvar="some string"
size=${#myvar}
Untuk mengkonfirmasi itu disimpan dengan benar, echo
itu:
$ echo "$size"
11
$rulename
dimulai dengan $RULE_PREFIX
awalan: [ "${rulename:0:${#RULE_PREFIX}}" == "$RULE_PREFIX" ]
#myvar
dan {#myvar}
?
${#parameter}
: Panjang karakter dari nilai parameter yang diperluas diganti .
Kamu bisa menggunakan:
MYSTRING="abc123"
MYLENGTH=$(printf "%s" "$MYSTRING" | wc -c)
wc -c
atau wc --bytes
untuk jumlah byte = Karakter Unicode dihitung dengan 2, 3 atau lebih byte.wc -m
atau wc --chars
untuk jumlah karakter = Karakter Unicode dihitung tunggal hingga mereka menggunakan lebih banyak byte.mylen=$(printf "%s" "$HOME/.ssh" | wc -c)
sedangkan solusi yang diterima gagal dan Anda harus myvar=$HOME/.ssh
terlebih dahulu.
Saya ingin kasus paling sederhana, akhirnya ini hasilnya:
echo -n 'Tell me the length of this sentence.' | wc -m;
36
echo '' | wc -m
=> 1
. Kamu harus menggunakan -n
: echo -n '' | wc -m
=> 0
... dalam hal ini solusi yang bagus :)
-n do not output the trailing newline
Jika Anda ingin menggunakan ini dengan baris perintah atau fungsi argumen, pastikan Anda menggunakan size=${#1}
bukan size=${#$1}
. Yang kedua mungkin lebih insting tetapi sintaksisnya salah.
size=${#1}
tentu valid.
#
tidak menggantikan $
- bagian $
luar kawat gigi masih merupakan operator ekspansi. The #
adalah operator panjang, seperti biasa.
Menanggapi mulai posting:
Jika Anda ingin menggunakan ini dengan argumen baris perintah atau fungsi ...
dengan kode:
size=${#1}
Mungkin ada kasus di mana Anda hanya ingin memeriksa argumen panjang nol dan tidak perlu menyimpan variabel. Saya yakin Anda bisa menggunakan sintaks semacam ini:
if [ -z "$1" ]; then
#zero length argument
else
#non-zero length
fi
Lihat GNU dan wooledge untuk daftar ekspresi bersyarat Bash yang lebih lengkap.
Berikut adalah beberapa cara untuk menghitung panjang variabel:
echo ${#VAR}
echo -n $VAR | wc -m
echo -n $VAR | wc -c
printf $VAR | wc -m
expr length $VAR
expr $VAR : '.*'
dan untuk mengatur hasil dalam variabel lain cukup berikan perintah di atas dengan kutipan kembali ke variabel lain sebagai berikut:
otherVar=`echo -n $VAR | wc -m`
echo $otherVar
http://techopsbook.blogspot.in/2017/09/how-to-find-length-of-string-variable.html