Как найти длину строки в оболочке

Как найти длину строки в оболочке

Мне нужно вычислить длину строки, используя только чистую оболочку sh. На /bin/shсамом деле это мягкая ссылка на bash или другую оболочку. Следовательно, ${#STRING}выдает длину строки, так как это расширенная функция bash.

Может кто-нибудь подскажет, как узнать длину строки? Я использую архитектуру Solaris 5.10 Sparc

решение1

wc -mподсчитывает символы в строке. Так что вы можете сделать что-то вроде:

STRLENGTH=$(echo -n $STRING | wc -m)

Альтернативный синтаксис:

STRLENGTH=`echo -n $STRING | wc -m`

Флаг -nдля echo не позволяет ему печатать новую строку. Флаг может быть другим в Solaris 5. Проверьтеman echo

решение2

Вот несколько способов сделать это.

myvar="This is a test"
echo "${#myvar}"
14

Или

expr length "${myvar}"
14

решение3

Используя ${#string}, чтобы получить длину $string,расширение параметра оболочки POSIX. Это не bashединственная функция.

В Solaris 5.10, если /bin/shили /usr/bin/sh(как указано вsh(1)руководство) не поддерживает это, то /usr/xpg4/bin/shбудет.

Чтобы получить поведение POSIX в системе Solaris 5.10, необходимо PATHустановить значение

/usr/xpg6/bin:/usr/xpg4/bin:/usr/ccs/bin:/usr/bin

(в указанном порядке), как описано вstandards(5)руководство.

решение4

Я не думаю, что "чистый sh" может это сделать. Но вам не нужно ничего делать в "чистом sh"; вам нужно сделать это в sh плюс стандартные утилиты. Самый простой способ:

strlength=`expr "$string" : ".*"`

(выражениеPOSIX). Или, если у вас его нет expr(Solaris 5.1 устарел), вы также можете использоватьТуалетвместе сprintfнравиться:

strlength=`printf "%s" "$string" | wc -m`

Только не пытайтесь использовать echo, потому что echo добавит завершающие переносы строк, и стандартного способа подавить это не существует.

Обратите внимание, что wc -mподсчет символов и wc -cбайтов производится, если есть разница в текущей локали.

Связанный контент