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
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 deecho '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
elong
) paraecho
queecho
saídas separadas por um espaço (e seguidas por uma nova linha), enquanto emecho 'Too long'
, passamos umaToo long
argumento para que é exibido seguido por uma nova linha. Portanto, é ' equivalente funcionalmente.
/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.dash
' s${#string}
forneceria o comprimento em número de bytes em vez de caracteres.