Ich versuche zu lernen, wie man getopts verwendet, damit ich Skripte mit analysierter Eingabe haben kann (obwohl ich denke, dass getopts besser sein könnte). Ich versuche nur ein einfaches Skript zu schreiben, um die Prozentsätze der Partitionsnutzung zurückzugeben. Das Problem ist, dass eine meiner Bash-Funktionen nicht zu mögen scheint, dass ich $1
als Variable innerhalb der Funktion verweise . Der Grund, auf den ich verweise, $1
ist, dass der get_percent
Funktion ein Einhängepunkt als optionales Argument übergeben werden kann, das anstelle aller Einhängepunkte angezeigt werden soll.
Das Skript
#!/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
# ...
Die Ausgabe
$ 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
quelle
quelle
getopts
hat, oder? Ihr Skript wird-u
vor dem Aufruf beendetgetopts
.Antworten:
set -u
wird genau so abgebrochen, wie Sie es beschreiben, wenn Sie auf eine Variable verweisen, die nicht festgelegt wurde. Sie rufen Ihr Skript ohne Argumente auf, werden alsoget_percent
ohne Argumente aufgerufen, was$1
dazu führt , dass es nicht gesetzt wird.Überprüfen Sie dies entweder, bevor Sie Ihre Funktion aufrufen, oder verwenden Sie Standarderweiterungen (
${1-default}
wird erweitert,default
wenn nicht bereits etwas anderes festgelegt ist).quelle
[ -n "${1-}" ]
(dh mit einem leeren Standardwert), um zu sehen, ob der Parameter gesetzt und nicht leer ist; oder um[ "${1+x}" = x ]
zu sehen, ob es gesetzt ist, auch wenn es leer ist.if [[ -n ${1-default} ]]
Dies ist die Wirkung von
set -u
.Sie können
$#
die Funktion überprüfen und Verweise vermeiden,$1
wenn sie nicht festgelegt ist.Mit können
$#
Sie auf die Anzahl der Parameter zugreifen. Im globalen Kontext ist es die Anzahl der Parameter für das Skript, in einer Funktion die Anzahl der Parameter für die Funktion.Im Kontext der Frage ist es
Beachten Sie, dass Sie verwenden müssen
[ $# -ge 1 ] && [ -n "$1" ]
und nicht[ $# -ge 1 -a -n "$1" ]
, da dies zuerst ausgewertet$1
und dann überprüft werden würde$#
.quelle
Da dies der
bash
Fall ist , können Sie die Prüfung für$1
das Setzen umgehen und nur verwenden"$@"
($1
ist der erste Parameter,$@
sind alle von ihnen; wenn es in doppelten Anführungszeichen steht, verschwindet es vollständig, wenn es keine Werte hat, wodurch verhindert wird, dass es abgefangen wirdset -u
):Ich habe auch den Rest der Zeile leicht angepasst, damit zwischen den beiden von Ihnen ausgegebenen Werten kein {Leerzeichen} {Tab} {Leerzeichen} angezeigt wird, sondern nur ein {Tab}. Wenn Sie die beiden unsichtbaren Leerzeichen wirklich möchten, ändern Sie die
awk
zu verwendendeprintf "%s \t %s\n", $1, $5
.quelle
$@
für Sie hinzugefügt