Eu tenho que verificar o comprimento da variável de leitura (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"?
/bin/sh
. Você deve alterar a linha shebang para#!/bin/sh
para que fique mais portátil e execute em ambientes onde o bash não está disponível. Além disso,/bin/sh
pode ser um shell mais leve, como o dash, que não está sobrecarregado com os recursos destinados ao uso interativo.dash
's${#string}
iria dar-lhe o comprimento em número de bytes em vez de caracteres.Respostas:
Mais elegante? Não
Mais curta? Sim :)
E se você não tiver nenhum problema em negociar mais elegância em favor de ser mais baixo, poderá ter um script com 2 linhas a menos:
Você pode usar colchetes duplos se achar que é mais seguro. Explicação aqui .
fonte
Uma alternativa compatível com Bourne (
${#string}
é POSIX, mas não Bourne (não é provável que você encontre um shell Bourne atualmente):Observe que para ambos
${#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 comodash
esse não são compatíveis com vários bytes, serão bytes.Com
mksh
, você precisaset -o utf8-mode
(em localidades UTF-8) para entender caracteres de vários bytes:fonte
echo Too long
diferente sob o capô deecho 'Too long'
if
opção :)echo Too long
passa dois argumentos (Too
elong
) para osecho
quais asecho
saídas são separadas por um espaço (e seguidas por uma nova linha), enquanto dentroecho 'Too long'
, passamos umToo long
argumento para oecho
qual ele é exibido após uma nova linha. Portanto, é funcionalmente equivalente.