Quando você expande uma variável fora das aspas duplas, como em expr $str2
, ocorrem as seguintes ações:
- Pegue o valor da variável. O resultado é uma string.
- Divida o valor em partes delimitadas por espaço em branco.¹ O resultado é uma lista de strings.
- Interprete cada elemento da lista como padrão curinga, ou seja, globbing . Se corresponder a arquivos, substitua o elemento pela lista de correspondências. Se não corresponder a nenhum arquivo, deixe o elemento sozinho.
Por exemplo, o valor da sua variável contém a palavra *
, que é substituída pela lista de nomes de arquivos no diretório atual.
Em geral, sempre coloque aspas duplas em torno de substituições de variáveis e substituições de comandos: "$stuff"
, "'stuff'"
. Veja Por que meu script de shell engasgue-se com espaços em branco ou outros caracteres especiais? Apenas deixe de fora as aspas se você souber e entender por que você precisa deixar de fora as aspas.
Nesse caso, é necessário que a etapa 2 (divisão) aconteça, porque expr
precisa dos operadores e operandos em argumentos separados. Mas o passo 3 (tratando cada palavra como um padrão curinga de nome de arquivo) não deve acontecer. Você pode fazer isso desligando globbing:
result='set -f; expr $str2'
Em ksh ou bash, use um array ao invés de uma string - mas nesses shells você não teria nenhum uso para expr
.
A menos que você precise que seu script seja portável para os antigos shell Bourne, você não precisa usar expr
. Expressões aritméticas são um recurso POSIX padrão.
result=$(($str2))
¹ Os caracteres do separador podem ser configurados por meio da variável IFS
.