Verifique o comprimento de uma variável

Eu vou verificar o comprimento da variável lida (meu script limita a cinco caracteres inseridos), penso em algo como isto:

#!/bin/bash read string check=${#string} echo $check if [ $check -ge 5 ]; then echo "error" ; exit else echo "done" fi 

existe uma solução mais “elegante”?

Comentários

  • Seu script funciona corretamente no POSIX padrão /bin/sh. Você deve considerar alterar a linha shebang para #!/bin/sh para que seja mais portátil e executado em ambientes onde bash isn ' t disponível. Além disso, /bin/sh pode ser um shell mais leve, como traço que isn ' t sobrecarregado com recursos destinados ao uso interativo.
  • @Celada, verdadeiro embora, neste caso, dash ' s ${#string} forneceria o comprimento em número de bytes em vez de caracteres.

Resposta

M minério elegante? Não

Mais curto? Sim 🙂

#!/bin/bash read string if [ ${#string} -ge 5 ]; then echo "error" ; exit else echo "done" fi 

E se você não tem problemas em trocar mais elegância por ser mais curto, você pode ter um script com 2 linhas a menos:

#!/bin/bash read string [ ${#string} -ge 5 ] && echo "error" || echo "done" 

Você pode usar colchetes duplos se achar que é mais seguro. Explicação aqui .

Resposta

Um compatível com Bourne alternativa (${#string} é POSIX, mas não Bourne (não que seja provável que você encontre um shell Bourne atualmente)):

case $string in ?????*) echo >&2 Too long; exit 1;; *) echo OK esac 

Observe que para ${#string} e ????, se será o número de bytes ou caracteres dependerá o shell. Geralmente (e é exigido pelo POSIX), é o número de caracteres. Mas para alguns shells como dash que não reconhecem bytes múltiplos, serão bytes.

Com mksh, você precisa de set -o utf8-mode (em localidades UTF-8) para entender caracteres multibyte:

$ string=€€€ bash -c "echo "${#string}"" 3 $ string=€€€ dash -c "echo "${#string}"" 9 $ string=€€€ mksh -c "echo "${#string}"" 9 $ string=€€€ mksh -o utf8-mode -c "echo "${#string}"" 3 $ locale charmap UTF-8 

Comentários

  • fora do tópico, mas é echo Too long diferente de echo 'Too long'
  • E, se você apenas imprimir quando ' s " muito longo ", posso compactar ainda mais na minha if opção 🙂
  • @StevenPenny, echo Too long passa dois argumentos (Too e long) para echo que echo saídas separadas por um espaço (e seguidas por uma nova linha), enquanto em echo 'Too long', passamos uma Too long argumento para que é exibido seguido por uma nova linha. Portanto, é ' equivalente funcionalmente.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *