Verifique o tamanho de uma variável

17

Tenho que verificar o comprimento da variável read (meu limite de script para cinco dos 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"?

    
por Pol Hallen 17.07.2014 / 19:08

2 respostas

33

Mais 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 negociar mais elegância em favor de 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 .

    
por 17.07.2014 / 20:05
3

Uma alternativa compatível com o Bourne ( ${#string} é POSIX, mas não Bourne (não é provável que você venha a encontrar 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á do shell. Geralmente (e é exigido pelo POSIX), é o número de caracteres. Mas para alguns shells como dash que não são multi-byte, serão bytes.

Com mksh , você precisa de set -o utf8-mode (em locales UTF-8) para entender caracteres de múltiplos bytes:

$ 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
    
por 20.04.2017 / 18:30