4

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

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

8 ответов8

6

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

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

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

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

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

6

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

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

Или же

expr length "${myvar}"
14
2

Вот несколько способов:

echo ${#VAR}
echo -n $VAR | wc -m
echo -n $VAR | wc -c
printf $VAR | wc -m
expr length $VAR
expr $VAR : '.*'

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

1

Использование ${#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).

1

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

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

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

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

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

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

0

set var = "test test test";

echo $% var;

14

0

(Хотя ответов уже много, но они не настолько интуитивны, поэтому я бы добавил один, чтобы прояснить это с первого взгляда)

Если вы просто хотите сделать это в командной строке ( bash) (или даже в скрипте).

Вы можете использовать один из следующих способов:

  • Используйте echo -n и wc -m
  • Используйте printf и wc -m

например

# 5
echo -n hello | wc -m

# 11
echo -n "hello world" | wc -m

# 5
printf "hello" | wc -m

# 11
printf "hello world" | wc -m

# 11
printf "hello %s" world | wc -m

Подсказки:

  • echo по умолчанию добавит новую строку в конце, поэтому для ее предотвращения необходима опция -n .
  • Если между входной строкой есть пробел, то следует заключить ее в кавычки.
-1

Вы можете сделать это довольно просто в Python

>>> len('hello world')
11

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .