Bagaimana Anda mendapatkan panjang string yang disimpan dalam variabel dan menetapkannya ke variabel lain?
myvar="some string"
echo ${#myvar}
# 11
Bagaimana Anda mengatur variabel lain ke output 11
?
Bagaimana Anda mendapatkan panjang string yang disimpan dalam variabel dan menetapkannya ke variabel lain?
myvar="some string"
echo ${#myvar}
# 11
Bagaimana Anda mengatur variabel lain ke output 11
?
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:
Untuk mengkonfirmasi itu disimpan dengan benar,
echo
itu:sumber
$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:
wc -c
atauwc --bytes
untuk jumlah byte = Karakter Unicode dihitung dengan 2, 3 atau lebih byte.wc -m
atauwc --chars
untuk jumlah karakter = Karakter Unicode dihitung tunggal hingga mereka menggunakan lebih banyak byte.sumber
mylen=$(printf "%s" "$HOME/.ssh" | wc -c)
sedangkan solusi yang diterima gagal dan Anda harusmyvar=$HOME/.ssh
terlebih dahulu.Saya ingin kasus paling sederhana, akhirnya ini hasilnya:
sumber
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}
bukansize=${#$1}
. Yang kedua mungkin lebih insting tetapi sintaksisnya salah.sumber
size=${#1}
tentu valid.#
tidak menggantikan$
- bagian$
luar kawat gigi masih merupakan operator ekspansi. The#
adalah operator panjang, seperti biasa.Menanggapi mulai posting:
dengan kode:
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:
Lihat GNU dan wooledge untuk daftar ekspresi bersyarat Bash yang lebih lengkap.
sumber
Menggunakan contoh Anda disediakan
sumber
Berikut adalah beberapa cara untuk menghitung panjang variabel:
dan untuk mengatur hasil dalam variabel lain cukup berikan perintah di atas dengan kutipan kembali ke variabel lain sebagai berikut:
http://techopsbook.blogspot.in/2017/09/how-to-find-length-of-string-variable.html
sumber