Мне нужно вычислить длину строки, используя только чистую оболочку 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
байтов производится, если есть разница в текущей локали.