変数に格納されている文字列の長さを取得し、それを別の変数に割り当てるにはどうすればよいですか。
myvar="some string"
echo ${#myvar}
# 11
出力11
に別の変数をどのように設定しますか?
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
そうでもないpretty...このために、ちょっとした機能があります:
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
しかし、ダブルスペース文字、ゼロスペース文字、逆置換、その他単純ではないその他のような奇妙なUTF-8の振る舞いが残りました... diffU8test.sh または- diffU8test.sh.txt その他の制限について。
変数に格納されている文字列の長さを取得するには、次のようにします。
myvar="some string"
size=${#myvar}
正しく保存されたことを確認するには、echo
と入力します。
$ echo "$size"
11
あなたが使用することができます:
MYSTRING="abc123"
MYLENGTH=$(printf "%s" "$MYSTRING" | wc -c)
wc -c
またはwc --bytes
= Unicode文字は2、3、またはそれ以上のバイトでカウントされます。wc -m
またはwc --chars
= Unicode文字は、バイト数が増えるまで1回カウントされます。これをコマンドラインまたは関数の引数で使用したい場合は、size=${#1}
の代わりにsize=${#$1}
を使用してください。 2番目のものはもっと本能的かもしれませんが、間違った構文です。
私は最も単純なケースが欲しかった、最後にこれは結果です:
echo -n 'Tell me the length of this sentence.' | wc -m;
36
あなたの例を使って
#KISS (Keep it simple stupid)
size=${#myvar}
echo $size
私は似たようなことをやろうとしていました、しかし私はただユーザー入力が長すぎないことを確かめたかったです。
if [ ${#string} -ge 12 ]; then
echo ">= 12 characters. too long"
exit
else
echo "under 12 characters, not too long."
fi
変数の長さを計算する方法はいくつかあります。
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