Come verificare se non ci sono parametri forniti per un comando?


Risposte:


112

Per verificare se non sono stati forniti argomenti per il comando, controllare il valore della $#variabile quindi,

if [ $# -eq 0 ]; then
    echo "No arguments provided"
    exit 1
fi

Se si desidera utilizzare $*( non preferibile ),

if [ "$*" == "" ]; then
    echo "No arguments provided"
    exit 1
fi

Qualche spiegazione:

Il secondo approccio non è preferibile perché nell'espansione dei parametri posizionali si *espande ai parametri posizionali, a partire da uno. Quando l'espansione avviene tra virgolette doppie, si espande in una singola parola con il valore di ciascun parametro separato dal primo carattere della variabile speciale IFS. Ciò significa che viene costruita una stringa. Quindi c'è un sovraccarico extra.

D'altra parte si #espande al numero di parametri posizionali.

Esempio:

$ command param1 param2

Qui,

Il valore di $#è 2 e il valore di $*è la stringa "param1 param2" (senza virgolette), se IFS non è impostato. Perché se IFS non è impostato, i parametri sono separati da spazi

Per ulteriori dettagli man bashe leggere l'argomento denominato Parametri speciali


5
Oppure if ! (($#)); ..., oppure if (($# == 0)); ..., oppure if [ $# -eq 0 ]; ..., oppure ! (($#)) && ..., oppure(($#)) || ...
nicerobot,

7
[ $# -eq 0 ]è la forma più comune IME. Esistono casi limite in cui "$#"può essere vuoto: se c'è un singolo argomento che è vuoto o se ci sono diversi argomenti vuoti ed $IFSè vuoto.
Gilles 'SO- smetti di essere malvagio' il

1
L' "$*"espressione valuterà anche ""se è ""stato passato un solo parametro. Ma la maggior parte delle volte probabilmente non ti interesserà comunque.
arte

Credo che dovrebbe essere = invece di == ... attualmente sto ricevendo un errore imprevisto dell'operatore e la modifica in = risolve il problema.
Beh, in realtà il

@Charlotte Ciò significa che non stai utilizzando bash. Stai usando shper eseguire lo script. AFAIK ==è valido solo in bash.
Sachin Divekar,

14

Se sei interessato al salvataggio solo se manca un argomento particolare, la sostituzione dei parametri è ottima:

#!/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

-4

questo è uno dei modi in cui puoi sapere di non avere argomenti

NO_ARGS=0
if [ $# -eq "$NO_ARGS" ]; then
    {do something}
fi

5
Questo sembra essere un modo contorto di fare ciò che la risposta accettata ha scritto 5 anni fa ....
Jeff Schaller
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.