Como você verifica se $*
está vazio? Em outras palavras, como verificar se não houve argumentos fornecidos a um comando?
Como você verifica se $*
está vazio? Em outras palavras, como verificar se não houve argumentos fornecidos a um comando?
Respostas:
Para verificar se não houve argumentos fornecidos ao comando, verifique o valor da $#
variável e, em seguida,
if [ $# -eq 0 ]; then
echo "No arguments provided"
exit 1
fi
Se você deseja usar $*
( não preferível ), então,
if [ "$*" == "" ]; then
echo "No arguments provided"
exit 1
fi
Alguma explicação:
A segunda abordagem não é preferível, porque na expansão de parâmetros posicionais se *
expande para os parâmetros posicionais, começando por um. Quando a expansão ocorre entre aspas duplas, ela se expande para uma única palavra com o valor de cada parâmetro separado pelo primeiro caractere da variável especial IFS. Isso significa que uma string é construída. Portanto, há sobrecarga extra.
Por outro lado, #
expande para o número de parâmetros posicionais.
Exemplo:
$ command param1 param2
Aqui,
O valor de $#
é 2 e o valor de $*
é a sequência "param1 param2" (sem aspas), se o IFS não estiver definido. Porque se o IFS não estiver definido, os parâmetros serão separados por espaços
Para mais detalhes man bash
e leia o tópico chamado Parâmetros Especiais
[ $# -eq 0 ]
é a forma mais comum de IME. Existem casos extremos onde "$#"
pode estar vazio: se houver um único argumento vazio, ou se houver vários argumentos vazios e $IFS
estiver vazio.
"$*"
expressão também avaliará ""
se apenas um ""
parâmetro foi passado. Mas na maioria das vezes você provavelmente não se importará com isso.
bash
. Você está usando sh
para executar o script. O AFAIK ==
é válido apenas em bash
.
Se você estiver interessado apenas em resgatar se um argumento em particular estiver ausente, a Substituição de parâmetros é excelente:
#!/bin/bash
# usage-message.sh
: ${1?"Usage: $0 ARGUMENT"}
# Script exits here if command-line parameter absent,
#+ with following error message.
# usage-message.sh: 1: Usage: usage-message.sh ARGUMENT
essa é uma das maneiras pelas quais você pode saber que não tem argumentos
NO_ARGS=0
if [ $# -eq "$NO_ARGS" ]; then
{do something}
fi
if ! (($#)); ...
, ouif (($# == 0)); ...
, ouif [ $# -eq 0 ]; ...
, ou! (($#)) && ...
, ou(($#)) || ...