web-dev-qa-db-ja.com

Bashの文字列の長さ

変数に格納されている文字列の長さを取得し、それを別の変数に割り当てるにはどうすればよいですか。

myvar="some string"
echo ${#myvar}  
# 11

出力11に別の変数をどのように設定しますか?

350
AJP

UTF-8文字列の長さ

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 その他の制限について。

229
F. Hauri

変数に格納されている文字列の長さを取得するには、次のようにします。

myvar="some string"
size=${#myvar} 

正しく保存されたことを確認するには、echoと入力します。

$ echo "$size"
11
419
fedorqui

あなたが使用することができます:

MYSTRING="abc123"
MYLENGTH=$(printf "%s" "$MYSTRING" | wc -c)
  • バイト数の場合のwc -cまたはwc --bytes = Unicode文字は2、3、またはそれ以上のバイトでカウントされます。
  • 文字数用のwc -mまたはwc --chars = Unicode文字は、バイト数が増えるまで1回カウントされます。
19
atesin

これをコマンドラインまたは関数の引数で使用したい場合は、size=${#1}の代わりにsize=${#$1}を使用してください。 2番目のものはもっと本能的かもしれませんが、間違った構文です。

14
Dick Guertin

投稿開始に応答して:

これをコマンドラインや関数の引数で使いたい場合は...

コードで:

size=${#1}

単に長さゼロの引数をチェックしたいだけで、変数を格納する必要がない場合もあります。私はあなたがこの種の構文を使うことができると思います:

if [ -z "$1" ]; then
    #zero length argument 
else
    #non-zero length
fi

Bash条件式のより完全なリストについては、 _ gnu _ および wooledge を参照してください。

11
JGFMK

私は最も単純なケースが欲しかった、最後にこれは結果です:

echo -n 'Tell me the length of this sentence.' | wc -m;
36
10
dmatej

あなたの例を使って

#KISS (Keep it simple stupid)
size=${#myvar}
echo $size
8
thistleknot

私は似たようなことをやろうとしていました、しかし私はただユーザー入力が長すぎないことを確かめたかったです。

if [ ${#string} -ge 12 ]; then 
    echo ">= 12 characters. too long"
    exit
else 
    echo "under 12 characters, not too long."
fi
7
TrophyGeek

変数の長さを計算する方法はいくつかあります。

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

7
Mukesh Shakya