Usando o valor padrão de IFS , considere
unset var
set -- ${var:-"hello"}
echo "$#"
Isso imprime 1 à medida que a expansão do parâmetro é expandida para a única string hello .
unset var
set -- "${var:-"hello"}"
echo "$#"
Isso também gera 1 pelo mesmo motivo.
No entanto, se você usar ksh93 , as seguintes saídas serão 3 , enquanto dash , bash , pdksh e zsh produzirão 1 .
unset var
set -- "${var:-" hello "}"
echo "$#"
No caso ksh93 , obtemos 3 e "$@" duas strings vazias como $1 e $3 , enquanto $2 é a string hello sem espaços de flanqueamento. O comando expandido parece ser set -- "" hello "" in ksh93 e set -- " hello " em outros shells.
Uma questão relacionada (acredito) é
unset var
set -- ${var:-""}
echo "$#"
que gera 1 em todos os shells iguais a sh , exceto em ksh93 , onde gera 0 . Em ksh93 , as aspas parecem ser removidas da string vazia antes da divisão do campo ser executada.
O comportamento ksh93 poderia ser explicado e suportado por como o POSIX diz que as expansões, etc., devem ser executadas?
Para o último dos dois exemplos onde o comportamento entre os shells diferem, eu pessoalmente acho que é um bug (o comando deve expandir de set -- ${var:-""} para set -- "" , não para set -- ), mas para o primeiro exemplo (aquele com set -- "${var:-" hello "}" ) não tenho tanta certeza.
Para testar ksh93 , estou usando a "Versão AJM 93u + 2012-08-01" no OpenBSD 6.4, e também a "Versão A 2017.0.0-devel-2040-g36a76aca", que é a versão atual do desenvolvimento do concha.