Preciso calcular o comprimento de uma string usando apenas sh shell puro. O que está acontecendo é que /bin/sh
na verdade é um link direto para o bash ou outro shell. Conseqüentemente, ${#STRING}
fornece o comprimento da string, pois é um recurso avançado do bash.
Alguém pode me dizer como posso encontrar o comprimento da string? Estou usando a arquitetura Solaris 5.10 Sparc
Responder1
wc -m
conta os caracteres em uma string. Então você pode fazer algo como:
STRLENGTH=$(echo -n $STRING | wc -m)
Sintaxe alternativa:
STRLENGTH=`echo -n $STRING | wc -m`
O -n
sinalizador para echo impede que ele imprima uma nova linha. A bandeira pode ser diferente no Solaris 5. Verifiqueman echo
Responder2
Aqui estão algumas maneiras de fazer isso.
myvar="This is a test"
echo "${#myvar}"
14
Ou
expr length "${myvar}"
14
Responder3
Usar ${#string}
para obter o comprimento de $string
éuma expansão de parâmetro shell POSIX. Não é um bash
recurso exclusivo.
No Solaris 5.10, se /bin/sh
ou /usr/bin/sh
(conforme mencionado nosh(1)
manual) não suporta isso, então /usr/xpg4/bin/sh
o fará.
Para obter o comportamento POSIX em um sistema Solaris 5.10, você PATH
deve estar definido como
/usr/xpg6/bin:/usr/xpg4/bin:/usr/ccs/bin:/usr/bin
(nessa ordem), conforme descrito nostandards(5)
manual.
Responder4
Eu não acho que "puro sh" possa fazer isso. Mas você não precisa fazer nada em "puro sh"; você precisa fazer isso em sh plus utilitários padrão. A maneira mais direta é:
strlength=`expr "$string" : ".*"`
(expressãoé POSIX). Ou se não tiver expr
(Solaris 5.1 é antigo), você também pode usarBanheirojunto comimprimircomo:
strlength=`printf "%s" "$string" | wc -m`
Só não tente usar echo
, porque echo adicionará novas linhas ao final e não há uma maneira padrão de suprimi-las.
Observe que wc -m
conta caracteres e wc -c
conta bytes se houver uma diferença na localidade atual.