bash中字符串的长度

AJP*_*AJP 393 variables bash string-length

如何获取存储在变量中的字符串的长度并将其分配给另一个变量?

myvar="some string"
echo ${#myvar}  
# 11
Run Code Online (Sandbox Code Playgroud)

如何将另一个变量设置为输出11

fed*_*qui 447

要获取存储在变量中的字符串的长度,请说:

myvar="some string"
size=${#myvar} 
Run Code Online (Sandbox Code Playgroud)

要确认它已正确保存,echo它:

$ echo "$size"
11
Run Code Online (Sandbox Code Playgroud)

  • 使用UTF-8 stings,您可以使用字符串长度**和**字节长度.[见我的回答](http://stackoverflow.com/a/31009961/1765658) (8认同)
  • 您能解释一下 `#myvar` 和 `{#myvar}` 的表达式吗? (2认同)
  • @lerneradams 参见 `${#parameter}` 上的 [Bash 参考手册 →3.5.3 Shell 参数扩展](https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion) : _参数的扩展值的字符长度被替换_。 (2认同)

F. *_*uri 246

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
Run Code Online (Sandbox Code Playgroud)

将呈现:

Généralités is 11 char len, but 14 bytes len.
Run Code Online (Sandbox Code Playgroud)

你甚至可以查看存储的字符:

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"
Run Code Online (Sandbox Code Playgroud)

会回答:

Généralités has 11 chars, 14 bytes: ($'G\303\251n\303\251ralit\303\251s').
Run Code Online (Sandbox Code Playgroud)

诺塔:伊莎贝尔考恩的评论,我已经添加设置$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"
}
Run Code Online (Sandbox Code Playgroud)

将作为

strLen théorème
String 'théorème' is 10 bytes, but 8 chars len: $'th\303\251or\303\250me'
Run Code Online (Sandbox Code Playgroud)

有用的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
Run Code Online (Sandbox Code Playgroud)

不是很漂亮 ......为此,有一点功能:

strU8DiffLen () { 
    local bytlen oLang=$LANG oLcAll=$LC_ALL
    LANG=C LC_ALL=C
    bytlen=${#1}
    LANG=$oLang LC_ALL=$oLcAll
    return $(( bytlen - ${#1} ))
}
Run Code Online (Sandbox Code Playgroud)

那么现在:

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
Run Code Online (Sandbox Code Playgroud)

  • 您可能还需要设置 LC_ALL=C 以及其他设置。 (2认同)
  • 感谢您采用简单的方法并将其复杂化:) (2认同)
  • @thistleknot对不起,[对不起](https://translate.google.ch/#auto/fr/%E5%B0%8D%E4%B8%8D%E8%B5%B7)有时***很简单***只是一个想法。 (2认同)

小智 22

您可以使用:

MYSTRING="abc123"
MYLENGTH=$(printf "%s" "$MYSTRING" | wc -c)
Run Code Online (Sandbox Code Playgroud)
  • wc -c或者wc --bytes用于字节计数= Unicode字符用2,3或更多字节计数.
  • wc -m或者wc --chars对于字符计数= Unicode字符计数为单,直到它们使用更多字节.

  • -c是字节.-m代表字符.https://www.gnu.org/software/coreutils/manual/html_node/wc-invocation.html http://pubs.opengroup.org/onlinepubs/009604499/utilities/wc.html (4认同)
  • 真的吗?一个管道,一个子壳和一个外部命令的东西是微不足道的? (3认同)

dma*_*tej 16

我想要最简单的情况,最后这是一个结果:

echo -n 'Tell me the length of this sentence.' | wc -m;
36
Run Code Online (Sandbox Code Playgroud)

  • 对不起伙伴:(这是bash ......被诅咒的锤子,把所有东西看作钉子,特别是你的拇指.'告诉我这个句子的长度.'包含36个字符.`echo''| wc -m` =>` 1`.你需要使用`-n`:`echo -n''| wc -m` =>`0` ...在这种情况下它是一个很好的解决方案:) (4认同)
  • 谢谢指正!手册页说:`-n 不输出尾随换行符` (2认同)

Dic*_*tin 15

如果要将其与命令行或函数参数一起使用,请确保使用size=${#1}而不是size=${#$1}.第二个可能更本能,但语法不正确.

  • 事实并非如此.```不替换`$` - 大括号外的`$`仍然是扩展运算符.```是长度运算符,一如既往. (16认同)
  • "你不能做<无效语法>"的部分问题在于,该语法无效,不清楚读者应该将其解释为什么意思.`size = $ {#1}`当然有效. (14认同)

JGF*_*FMK 13

作为对帖子开始的回应:

如果你想在命令行或函数参数中使用它...

用代码:

size=${#1}
Run Code Online (Sandbox Code Playgroud)

可能存在这样的情况:您只想检查零长度参数并且不需要存储变量.我相信你可以使用这种语法:

if [ -z "$1" ]; then
    #zero length argument 
else
    #non-zero length
fi
Run Code Online (Sandbox Code Playgroud)

有关Bash条件表达式的更完整列表,请参阅GNUwooledge.


thi*_*not 11

使用提供的示例

#KISS (Keep it simple stupid)
size=${#myvar}
echo $size
Run Code Online (Sandbox Code Playgroud)


小智 9

以下是计算变量长度的几种方法:

echo ${#VAR}
echo -n $VAR | wc -m
echo -n $VAR | wc -c
printf $VAR | wc -m
expr length $VAR
expr $VAR : '.*'
Run Code Online (Sandbox Code Playgroud)

并将结果设置在另一个变量中,只需将带有反引号的上述命令分配给另一个变量,如下所示:

otherVar=`echo -n $VAR | wc -m`   
echo $otherVar
Run Code Online (Sandbox Code Playgroud)

http://techopsbook.blogspot.in/2017/09/how-to-find-length-of-string-variable.html


Tro*_*eek 7

我试图做类似的事情,但我只是想确保用户输入不是太长.

if [ ${#string} -ge 12 ]; then 
    echo ">= 12 characters. too long"
    exit
else 
    echo "under 12 characters, not too long."
fi
Run Code Online (Sandbox Code Playgroud)

  • 这不是问题的答案.FIY,问题是_如何获取存储在变量中的字符串的长度并将其分配给另一个变量?_如果您有其他问题,请随时问_a新问题. (3认同)