if [ $@ = "ffki" ]; then
O comando na cláusula if
expande para [
seguido pela lista de expansões curinga das palavras que compõem os parâmetros posicionais seguidas pelas palavras =
ffki
]
. De um modo geral, $VAR
não significa “o valor de VAR
” quando está fora de aspas duplas, isso significa “dividir o valor de VAR
em palavras separadas e interpretá-las como globs”. Veja Por que meu script de shell engasgar com espaço em branco ou outros caracteres especiais?
Além disso, "$@"
é um caso especial: expande-se para a lista de parâmetros posicionais (sem expansão adicional), não para uma única palavra (apesar das aspas). Você pode usar "$*"
, que se expande para uma única palavra composta de parâmetros posicionais separados por um espaço (mais precisamente, pelo primeiro caractere do valor de IFS
). Então, para testar se existe um único parâmetro posicional cujo valor seja ffki
, você pode usar
if [ "$*" = "ffki" ]; then
Como alternativa, você pode contar o número de parâmetros posicionais e testar seu valor individualmente. Isso seria necessário se você quisesse permitir valores contendo espaços, por exemplo.
if [ $# -eq 1 ] && [ "$1" = "ffki" ]; then
Para alterar os parâmetros posicionais, você estava próximo: use o set
builtin e passe o novo conjunto de parâmetros posicionais como argumentos separados. Se houver o risco de o primeiro parâmetro começar com -
, use set -- …
para que não seja interpretado como uma opção.
if [ "$*" = "ffki" ]; then
set -- -c "ffki"
fi