Em
echo Variable "$var" is not initialised.
Você está passando 5 argumentos para echo
(6, se contar echo
), echo
os produzirá separados por um caractere de espaço terminado com uma nova linha.
Em:
echo "Variable $var is not initialised."
Você está passando 2 argumentos, dos quais o primeiro já tem o echo
.
Neste caso particular e na maioria dos casos, isso será funcionalmente equivalente.
O segundo significa menos trabalho para o shell analisar o comando e armazená-lo em argumentos antes de executar echo
e menos trabalho para echo
passar por seus argumentos.
É improvável que isso faça uma diferença muito significativa. Em meus testes, vejo uma pequena diferença com algumas combinações de echo
/ shell
como bash
com sua integração, mas quase nenhuma em outras.
Outras razões pelas quais você pode querer passar um argumento em vez de vários:
- Se você quiser mais do que um espaço entre os argumentos:
echo a b
produziriaa b
, você precisaria deecho 'a b'
para a saídaa b
. - Em coisas como
echo "$opt" is an invalid option
, com algumas implementaçõesecho
comoecho
incorporadas debash
, que não funcionariam comopt=-e
(ou-E
ou-neE
...)echo "$opt is an invalid option"
seria OK. - Em
echo foo bar
, você está passando 2 argumentos de 3 bytes de comprimento cada, ou seja, 2 ponteiros (8 bytes cada em sistemas de 64 bits) e 6 bytes (22 bytes no total em sistemas de 64 bits). Embora seja um ponteiro e 7 bytes paraecho 'foo bar'
(15 bytes no total). Ao chamar o executávelecho
externo com uma lista grande de argumentos, isso pode fazer com que você atinja o limite do tamanho dos argumentos mais rapidamente (embora muitos sistemas também tenham um limite no tamanho máximo de um único argumento).
Em qualquer caso aqui, para dados arbitrários (como $var
cujo conteúdo não sabemos (embora no contexto aqui possamos derivar que contém apenas alnums e sublinhados)), você deseja usar printf
, não echo
:
printf '%s\n' "Variable $var is not initialised."
Ou:
printf 'Variable %s is not initialised.' "$var"
E, nesse caso, ao lado do formato, tem que ser um único argumento passado para printf
.