Como verificar se não há parâmetros fornecidos para um comando?

75

Como você verifica se $*está vazio? Em outras palavras, como verificar se não houve argumentos fornecidos a um comando?

bem, na verdade
fonte

Respostas:

112

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 bashe leia o tópico chamado Parâmetros Especiais

Sachin Divekar
fonte
5
Ou if ! (($#)); ..., ou if (($# == 0)); ..., ou if [ $# -eq 0 ]; ..., ou ! (($#)) && ..., ou(($#)) || ...
nicerobot
7
[ $# -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 $IFSestiver vazio.
Gilles
11
A "$*"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.
precisa saber é o seguinte
Eu acredito que deveria ser = em vez de == ... atualmente estou recebendo um erro inesperado do operador e mudar para = corrige o problema.
bem, na verdade
@Charlotte Isso significa que você não está usando bash. Você está usando shpara executar o script. O AFAIK ==é válido apenas em bash.
Sachin Divekar
14

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
Pat
fonte
-4

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
Joel Dsouza
fonte
5
Essa parece ser uma maneira complicada de fazer o que a resposta aceita escreveu há 5 anos ...
Jeff Schaller