Jak sprawdzić, czy polecenie nie ma parametrów?


Odpowiedzi:


110

Aby sprawdzić, czy nie podano argumentów dla polecenia, sprawdź wartość $#zmiennej,

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

Jeśli chcesz użyć $*( nie preferowane ),

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

Niektóre wyjaśnienia:

Drugie podejście nie jest preferowane, ponieważ w parametrach pozycyjnych rozszerzenie *rozszerza się na parametry pozycyjne, zaczynając od jednego. Kiedy rozwinięcie występuje w obrębie podwójnych cudzysłowów, rozwija się do pojedynczego słowa z wartością każdego parametru oddzieloną pierwszym znakiem zmiennej specjalnej IFS. Oznacza to, że łańcuch jest zbudowany. Jest więc dodatkowe obciążenie.

Z drugiej strony #rozwija się do liczby parametrów pozycyjnych.

Przykład:

$ command param1 param2

Tutaj,

Wartość $#wynosi 2, a wartość $*ciągu „param1 param2” (bez cudzysłowów), jeśli IFS jest rozbrojony. Ponieważ jeśli IFS nie jest ustawione, parametry są oddzielane spacjami

Aby uzyskać więcej informacji man bashi przeczytać temat o nazwie Parametry specjalne


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

7
[ $# -eq 0 ]jest najczęstszą postacią IME. Istnieją przypadki krawędzi, w których "$#"może być pusty: jeśli istnieje jeden argument, który jest pusty, lub jeśli istnieje kilka pustych argumentów i $IFSjest pusty.
Gilles,

1
"$*"Wyrażenie będzie również ocenić na ""razie tylko jeden ""parametr został przekazany. Ale przez większość czasu i tak prawdopodobnie nie będziesz się tym przejmować.
manatwork

Uważam, że powinno to być = zamiast == ... obecnie pojawia się nieoczekiwany błąd operatora, a zmiana na = rozwiązuje problem.
dobrze właściwie

@Charlotte Oznacza to, że nie używasz bash. Używasz shdo wykonania skryptu. AFAIK ==jest ważny tylko w bash.
Sachin Divekar,

14

Jeśli interesuje Cię zwolnienie za kaucją tylko w przypadku braku konkretnego argumentu, podstawienie parametru jest świetne:

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

jest to jeden ze sposobów, w jaki możesz wiedzieć, że nie dostałeś żadnych argumentów

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

5
To wydaje się być skomplikowanym sposobem robienia tego, co zaakceptowana odpowiedź napisał 5 lat temu ....
Jeff Schaller
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.