Jak sprawdzić, czy $*
jest pusty? Innymi słowy, jak sprawdzić, czy nie podano argumentów dla polecenia?
Jak sprawdzić, czy $*
jest pusty? Innymi słowy, jak sprawdzić, czy nie podano argumentów dla polecenia?
Odpowiedzi:
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 bash
i przeczytać temat o nazwie Parametry specjalne
[ $# -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 $IFS
jest pusty.
"$*"
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ć.
bash
. Używasz sh
do wykonania skryptu. AFAIK ==
jest ważny tylko w bash
.
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
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
if ! (($#)); ...
, lubif (($# == 0)); ...
, lubif [ $# -eq 0 ]; ...
, lub! (($#)) && ...
, lub(($#)) || ...