답변:
fedorqui의 정답 외에도 문자열 길이와 바이트 길이의 차이를 보여주고 싶습니다.
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
렌더링합니다 :
Généralités is 11 char len, but 14 bytes len.
저장된 문자를 볼 수도 있습니다.
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"
대답합니다 :
Généralités has 11 chars, 14 bytes: ($'G\303\251n\303\251ralit\303\251s').
참고 : Isabell Cowan의 의견 에 따르면에 설정을 추가 $LC_ALL
했습니다 $LANG
.
인수는 일반 변수와 동일하게 작동
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"
}
로 작동합니다
strLen théorème
String 'théorème' is 10 bytes, but 8 chars len: $'th\303\251or\303\250me'
printf
수정 도구 :만약 너라면:
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
정말 예쁘지 않습니다 ... 이것에는 약간의 기능이 있습니다.
strU8DiffLen () {
local bytlen oLang=$LANG oLcAll=$LC_ALL
LANG=C LC_ALL=C
bytlen=${#1}
LANG=$oLang LC_ALL=$oLcAll
return $(( bytlen - ${#1} ))
}
그런 다음 :
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
그러나 이중 간격 문자, 0 간격 문자, 역 변위 및 기타 단순하지 않은 이상한 UTF-8 동작이 남아 있습니다 ...
더 많은 제한 사항 은 diffU8test.sh 또는 diffU8test.sh.txt 를 참조하십시오.
변수에 저장된 문자열의 길이를 얻으려면 다음과 같이하십시오.
myvar="some string"
size=${#myvar}
제대로 저장되었는지 확인하려면 다음을 수행 echo
하십시오.
$ echo "$size"
11
$rulename
$RULE_PREFIX
[ "${rulename:0:${#RULE_PREFIX}}" == "$RULE_PREFIX" ]
#myvar
및 {#myvar}
?
${#parameter}
: 확장 된 parameter 값의 문자 길이는 대체 됩니다.
당신이 사용할 수있는:
MYSTRING="abc123"
MYLENGTH=$(printf "%s" "$MYSTRING" | wc -c)
wc -c
또는 wc --bytes
바이트 수 = 유니 코드 문자는 2, 3 개 이상의 바이트로 계산됩니다.wc -m
또는 wc --chars
문자 수 = 유니 코드 문자는 더 많은 바이트를 사용할 때까지 단일 문자로 계산됩니다.mylen=$(printf "%s" "$HOME/.ssh" | wc -c)
수용 된 솔루션이 실패하고 먼저 해야하는 것과 같은 것을 처리합니다 myvar=$HOME/.ssh
.
가장 간단한 경우를 원했고 결과는 다음과 같습니다.
echo -n 'Tell me the length of this sentence.' | wc -m;
36
echo '' | wc -m
=> 1
. 사용해야합니다 -n
: echo -n '' | wc -m
=> 0
... 그렇다면 좋은 솔루션입니다 :)
-n do not output the trailing newline
이것을 명령 행 또는 함수 인수와 함께 사용하려면 size=${#1}
대신 대신 사용하십시오 size=${#$1}
. 두 번째는 더 본능적이지만 잘못된 구문입니다.
size=${#1}
확실히 유효합니다.
#
일 교체되지 않은 $
- $
외부는 괄호 여전히 확장 연산자입니다. 는 #
언제나처럼, 길이 연산자입니다.
다음은 변수 길이를 계산하는 몇 가지 방법입니다.
echo ${#VAR}
echo -n $VAR | wc -m
echo -n $VAR | wc -c
printf $VAR | wc -m
expr length $VAR
expr $VAR : '.*'
결과를 다른 변수에 설정하려면 위의 명령을 다음과 같이 다른 변수에 역 따옴표로 지정하십시오.
otherVar=`echo -n $VAR | wc -m`
echo $otherVar
http://techopsbook.blogspot.in/2017/09/how-to-find-length-of-string-variable.html