Próbuję nauczyć się korzystać z getopts, aby móc mieć skrypty z analizowanym wejściem (chociaż myślę, że getopts może być lepszy). Próbuję napisać prosty skrypt, aby zwrócić procent użycia partycji. Problem polega na tym, że jedna z moich funkcji bash nie wydaje się podobać, że odwołuję się $1
jako zmienna w funkcji. Powodem, dla którego odwołam się, $1
jest to, że do get_percent
funkcji można przekazać punkt montowania jako opcjonalny argument do wyświetlenia zamiast wszystkich punktów montowania.
Scenariusz
#!/usr/bin/bash
set -e
set -u
set -o pipefail
get_percent(){
if [ -n "$1" ]
then
df -h $1 | tail -n +2 | awk '{ print $1,"\t",$5 }'
else
df -h | tail -n +2 | awk '{ print $1,"\t",$5 }'
fi
}
usage(){
echo "script usage: $(basename $0) [-h] [-p] [-m mount_point]" >&2
}
# If the user doesn't supply any arguments, we run the script as normal
if [ $# -eq 0 ];
then
get_percent
exit 0
fi
# ...
Wyjście
$ bash thing.sh
thing.sh: line 8: $1: unbound variable
$ bash -x thing.sh
+ set -e
+ set -u
+ set -o pipefail
+ '[' 0 -eq 0 ']'
+ get_percent
thing.sh: line 8: $1: unbound variable
bash
shell-script
scripting
Timothy Pulliam
źródło
źródło
getopts
, prawda? Twój skrypt kończy działanie z powodu-u
przed wywołaniemgetopts
.Odpowiedzi:
set -u
przerwie dokładnie tak, jak opisano, jeśli odwołujesz się do zmiennej, która nie została ustawiona. Wywołujesz skrypt bez argumentów, więcget_percent
jest wywoływany bez argumentów, co powoduje, że$1
jest rozbrojony.Sprawdź to przed wywołaniem funkcji lub użyj domyślnych rozszerzeń (
${1-default}
rozwinie się do,default
jeśli nie jest już ustawione na coś innego).źródło
[ -n "${1-}" ]
(czyli z pustą wartością domyślną), aby sprawdzić, czy parametr jest ustawiony i niepusty; lub[ "${1+x}" = x ]
sprawdzić, czy jest ustawiony, nawet jeśli jest pusty.if [[ -n ${1-default} ]]
unbound variable
dopóki nie użyłem:-
zamiast-
. Więc przynajmniej dla mnie${1:-default}
żaden samotnik nie podniósł błędu.To jest efekt
set -u
.Możesz sprawdzić
$#
wewnątrz funkcji i uniknąć odwoływania się,$1
jeśli nie jest ustawiona.Dzięki
$#
możesz uzyskać dostęp do liczby parametrów. W kontekście globalnym jest to liczba parametrów skryptu, w funkcji jest to liczba parametrów funkcji.Tak jest w kontekście pytania
Pamiętaj, że musisz użyć,
[ $# -ge 1 ] && [ -n "$1" ]
a nie[ $# -ge 1 -a -n "$1" ]
, ponieważ to najpierw ocenia,$1
a następnie sprawdza$#
.źródło
Ponieważ jest
bash
to możliwe, możesz ominąć sprawdzenie, czy$1
zostało ustawione i po prostu użyj"$@"
($1
jest to pierwszy parametr,$@
to wszystko; po podwójnym cudzysłowie znika całkowicie, jeśli nie ma żadnych wartości, co pozwala uniknąć jego złapaniaset -u
):Ulepszyłem też nieco resztę linii, aby nie wyświetlać {spacja} {tab} {spacja} między dwiema wartościami, które wypisujesz, ale zamiast tego otrzymujesz tylko {tab}. Jeśli naprawdę chcesz mieć dwie niewidoczne przestrzenie, zmień
awk
użycieprintf "%s \t %s\n", $1, $5
.źródło
$@
dla ciebie