Câu trả lời:
Ngoài câu trả lời đúng của fedorqui , tôi muốn chỉ ra sự khác biệt giữa độ dài chuỗi và độ dài 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
sẽ kết xuất:
Généralités is 11 char len, but 14 bytes len.
bạn thậm chí có thể có một cái nhìn vào các ký tự được lưu trữ:
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"
sẽ trả lời:
Généralités has 11 chars, 14 bytes: ($'G\303\251n\303\251ralit\303\251s').
Nota: Theo nhận xét của Isabell Cowan , tôi đã thêm cài đặt $LC_ALL
cùng với $LANG
.
Đối số hoạt động giống như các biến thông thường
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"
}
sẽ làm việc như
strLen théorème
String 'théorème' is 10 bytes, but 8 chars len: $'th\303\251or\303\250me'
printf
Công cụ chỉnh sửa hữu ích :Nếu bạn:
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
Không thực sự đẹp ... Đối với điều này, có một chức năng nhỏ:
strU8DiffLen () {
local bytlen oLang=$LANG oLcAll=$LC_ALL
LANG=C LC_ALL=C
bytlen=${#1}
LANG=$oLang LC_ALL=$oLcAll
return $(( bytlen - ${#1} ))
}
Ngay sau đó:
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
Nhưng đã để lại một số hành vi UTF-8 kỳ lạ, như ký tự cách dòng đôi, ký tự cách đều 0, độ lệch ngược và khác không thể đơn giản như ...
Hãy xem diffU8test.sh hoặc diffU8test.sh.txt để biết thêm các hạn chế.
Để có được độ dài của chuỗi được lưu trữ trong một biến, hãy nói:
myvar="some string"
size=${#myvar}
Để xác nhận nó đã được lưu chính xác, echo
nó:
$ echo "$size"
11
$rulename
bắt đầu bằng $RULE_PREFIX
tiền tố: [ "${rulename:0:${#RULE_PREFIX}}" == "$RULE_PREFIX" ]
#myvar
và {#myvar}
?
${#parameter}
: Độ dài tính bằng ký tự của giá trị mở rộng của tham số được thay thế .
Bạn có thể dùng:
MYSTRING="abc123"
MYLENGTH=$(printf "%s" "$MYSTRING" | wc -c)
wc -c
hoặc là wc --bytes
cho số byte = ký tự Unicode được tính bằng 2, 3 hoặc nhiều byte.wc -m
hoặc wc --chars
cho số lượng ký tự = Các ký tự Unicode được tính đơn lẻ cho đến khi chúng sử dụng nhiều byte hơn.mylen=$(printf "%s" "$HOME/.ssh" | wc -c)
trong khi giải pháp được chấp nhận thất bại và myvar=$HOME/.ssh
trước tiên bạn cần phải có .
Tôi muốn trường hợp đơn giản nhất, cuối cùng đây là kết quả:
echo -n 'Tell me the length of this sentence.' | wc -m;
36
echo '' | wc -m
=> 1
. Bạn cần sử dụng -n
: echo -n '' | wc -m
=> 0
... trong trường hợp đó là một giải pháp tốt :)
-n do not output the trailing newline
Nếu bạn muốn sử dụng điều này với các đối số dòng lệnh hoặc hàm, hãy đảm bảo bạn sử dụng size=${#1}
thay vì size=${#$1}
. Cái thứ hai có thể theo bản năng hơn nhưng cú pháp không chính xác.
size=${#1}
chắc chắn là hợp lệ
#
không thay thế $
- $
bên ngoài niềng răng vẫn là toán tử mở rộng. Các #
toán tử chiều dài, như mọi khi.
Đáp lại bài bắt đầu:
Nếu bạn muốn sử dụng điều này với các đối số dòng lệnh hoặc hàm ...
với mã:
size=${#1}
Có thể có trường hợp bạn chỉ muốn kiểm tra đối số có độ dài bằng không và không cần lưu trữ một biến. Tôi tin rằng bạn có thể sử dụng loại cú pháp này:
if [ -z "$1" ]; then
#zero length argument
else
#non-zero length
fi
Xem GNU và Wooledge để biết danh sách đầy đủ hơn các biểu thức điều kiện Bash.
Dưới đây là một số cách tính chiều dài của biến:
echo ${#VAR}
echo -n $VAR | wc -m
echo -n $VAR | wc -c
printf $VAR | wc -m
expr length $VAR
expr $VAR : '.*'
và để đặt kết quả trong một biến khác, chỉ cần gán lệnh trên với trích dẫn ngược lại vào một biến khác như sau:
otherVar=`echo -n $VAR | wc -m`
echo $otherVar
http://techopsbook.blogspot.in/2017/09/how-to-find-length-of-opes-variable.html