当前位置: 首页 > 知识库问答 >
问题:

bash中的字符串长度

慕容宏毅
2023-03-14

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

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

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

共有1个答案

欧阳斌
2023-03-14

除了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'

如果您:

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

但是留下了一些奇怪的UTF-8行为,像双间距字符,零间距字符,反向移位和其他不可能这么简单的...

有关更多限制,请查看diffu8test.sh或diffu8test.sh.txt。

 类似资料:
  • 问题内容: 不幸的是,Jinja不支持执行任意Python代码,例如 我当前的解决方法是使用不建议使用的,丑陋的,双下划线的方法: 尽管这可行,但恐怕将来某些字符串实现可能会破坏此代码。有一个更好的方法吗? 问题答案: 你可以使用length过滤器:

  • 问题内容: 我在SQL数据库中有一个字符串,表示一个URL。有些网址很短,有些很长。我真的不知道这是我可能遇到的最长的URL,所以为了安全起见,我会采用较大的值,例如256或512。 当我定义最大字符串长度时(例如,使用SQLAlchemy): 即使实际的字符串较短,这是否也会占用每一行的空间(存储空间)? 我假设这与实现细节有关。我正在使用postgreSQL,但对sqlite和mysql也很感

  • 要求出字符串的长度(字符的个数),我们可以使用length函数。调用这个函数的语法和我们前面看到的有点不同: int length; length = fruit.length(); 对于这种函数调用,我们称之为在字符串变量fruit上**调用(invoke)**length函数。“调用(invoke)”这个词可能看起来有点奇怪,但是后面我们还会遇到很多在对象上调用函数的例子。 函数调用的语法称

  • 问题内容: 我有一个长度为141个字符的字符串。使用以下代码,如果字符串大于或小于140,我有一条语句返回一条消息。 我在$ message上使用了var_dump,它显示的字符串是。这是我的问题:当我将语句的编号更改为和时,尽管字符串大于131,它仍然返回第一条消息。 无论我使用的数字少于141,我总是得到“没有比赛”。回到我身边。 问题答案: 尝试使用通用语法:

  • 问题内容: 我正在做一个从列表中返回最长字符串值的函数。当只有一个包含最多字符的字符串时,我的代码有效。如果有多个字符串,我尝试使其打印所有最长的字符串,并且我不希望重复它们。当我运行它时,它只返回“ hello”,而我希望它也返回“ ohman”和“ yoloo”。我觉得问题就在眼前,但是我已经尝试了所有方法,但是没有用。 问题答案: 首先 ,我们可以在列表中找到任何字符串的最大长度: 一点解释

  • 问题是,我试图这么做,但我检查字符串长度的方法不起作用;我能做些什么来修复它?