NicTheQuick
Anmeldungsdatum: 22. Oktober 2007
Beiträge: 144
|
Hallo Leute, ich habe mir ein Skript geschrieben, was automatisch ältere Kernel auflisten und auf Wunsch deinstallieren kann.
Einfach unter 'removeOldKernels.sh' abspeichern und mit 'chmod +x' entsprechende Ausführungsrechte geben. Dann könnt ihr mit dem Parameter -h auch schon die Hilfe einsehen. Ich habe in dieses Forum gepostet, weil ich fragen wollte, was ihr von diesem Skript hält und ob es vielleicht noch Fehler enthält, die in bestimmten Situationen auftreten könnten. Vielleicht habt ihr auch noch eine bessere Idee, wie die Funktionsweise auf Englisch besser formulieren könnte. Das klingt auch noch recht merkwürdig alles.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 | #!/bin/bash
REMOVE=0
LEAVE_KERNELS=1
CMD=$(basename $0)
VERSION="1.0"
USAGE="Usage: $CMD [-h | OPTIONS ]"
function printUsage() {
test "$1" && echo -e >&2 "$CMD: $1"
echo >&2 "$USAGE"
exit 2
}
function printHelp() {
cat << EOF
removeOldKernels version $VERSION
Removing the oldest kernels with one command.
(c) 2013 by Nicolas Göddel
Released without warranty under the terms of the GNU license.
$USAGE
Options:
-h, --help Print help
-r, --remove Remove the oldest kernels except the current
and the last one.
-l, --leave=LEAVE Except of leaving only the current and the last
kernel, leave the current and the LEAVE last
kernels.
EOF
exit 0
}
while [ "$#" -gt 0 ]; do
case "$1" in
-r|--remove)
REMOVE=1;;
-l|--leave)
LEAVE_KERNELS=$2;
shift;;
-h|--help)
printHelp;;
*)
printUsage "Invalid option '$1'!";;
esac
shift
done
if [ $LEAVE_KERNELS -lt 0 ]; then
LEAVE_KERNELS=0
fi
KERNELS=$(dpkg -l | grep ^ii | grep "linux-image-[0-9]" | awk -F' ' '{ print $2 }' | sort -V)
CURRENT=$(echo "$KERNELS" | sed 's/\ /\n/' | grep $(uname -r) | sed 's/linux-image//' | xargs -i echo " - linux-image{} linux-headers{}")
LATEST=$(echo "$KERNELS" | sed 's/\ /\n/' | grep -v $(uname -r) | tail -n $LEAVE_KERNELS | sed 's/linux-image//' | xargs -i echo " - linux-image{} linux-headers{}")
OLDEST=$(echo "$KERNELS" | sed 's/\ /\n/' | grep -v $(uname -r) | head -n -$LEAVE_KERNELS | sed 's/linux-image//' | xargs -i echo " - linux-image{} linux-headers{}")
echo "Current kernel:"
echo -e "$CURRENT\n"
if [ "$LATEST" != "" ]; then
echo "Latest kernels which will NOT be removed:"
echo -e "$LATEST\n"
fi
if [ $REMOVE -eq 1 ] ; then
echo "Removing old kernels:"
echo -e "$OLDEST\n"
dpkg -l | grep ^ii | grep "linux-image-[0-9]" | awk -F' ' '{ print $2 }' | grep -v `uname -r` | head -n -$LEAVE_KERNELS | sed 's/linux-image//' | xargs -i echo "linux-image{} linux-headers{}" | xargs sudo apt-get -y purge
else
if [ "$OLDEST" != "" ]; then
echo "Old kernels which will be removed:"
echo -e "$OLDEST\n"
echo "Use $0 -r -l $LEAVE_KERNELS to remove the listed kernels."
else
echo "There are no old kernels to remove."
fi
fi
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13177
|
Das sieht schon ordentlich aus! Nur ein paar Anmerkungen Zeile 6: $0 sollte man quoten. Zeile 37: Verabeitung von Optionen macht man besser mit getopts . Der kann nämlich auch mit mehreren Optionen hinter einem Strich arbeiten. Zeile 56: sämtliche grep hier sind überflüssig. Das kannst Du mit einem Ausdruck bei awk machen. (s.u.) Zeile 72: ebenfalls. Die Zeile ist auch viel zu lang, die würde ich mal umbrechen (einen Backslash am Ende). Zeile 72: die letzten beiden xargs kannst Du besser in einen zusammen fassen. uname -r führst Du viel zu oft aus: einmal ein einer Variablen speichern.
die Variable $LEAVE_KERNELS würde ich nach $KEEP_KERNELS umbenennen - das fühlt sich besser an. ☺
| awk -F' ' '/^ii .*linux-image-[0-9]/ { print $2 }'
|
Die Logik konnte ich mir nicht anschauen - Zeitmangel. Ciao robert
|
NicTheQuick
(Themenstarter)
Anmeldungsdatum: 22. Oktober 2007
Beiträge: 144
|
Danke dafür! Das sind alles gute Punkte. Vor allem getopt hatte ich so noch nicht gekannt. Ich habe das ganze jetzt mal umgeschrieben:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102 | #!/bin/bash
REMOVE=0
KEEP_KERNELS=1
CMD=$(basename "$0")
VERSION="1.0"
USAGE="Usage: $CMD [-h | OPTIONS ]"
function printUsage() {
test "$1" && echo -e >&2 "$CMD: $1"
echo >&2 "$USAGE"
exit 2
}
function printHelp() {
cat << EOF
removeOldKernels version $VERSION
Removing the oldest kernels with one command.
(c) 2013 by Nicolas Göddel
Released without warranty under the terms of the GNU license.
$USAGE
Options:
-h, --help Print help
-r, --remove Remove the oldest kernels except the current
and the last one.
-l, --leave=LEAVE Except of leaving only the current and the last
kernel, leave the current and the LEAVE last
kernels.
EOF
exit 0
}
TEMP=$(getopt -o rl:h --long remove,leave:,help -n "$CMD" -- "$@")
if [ $? != 0 ] ; then
printUsage
exit 1
fi
eval set -- "$TEMP"
while true ; do
case "$1" in
-r|--remove)
REMOVE=1;
shift;;
-l|--leave)
KEEP_KERNELS=$2;
shift 2;;
-h|--help)
printHelp;
shift;;
--)
shift;
break;;
*)
printUsage "Invalid option '$1'!";
exit 1;;
esac
done
if [ $KEEP_KERNELS -lt 0 ]; then
KEEP_KERNELS=0
fi
CURRENT_KERNEL=$(uname -r)
KERNELS=$(dpkg -l | awk -F' ' '/^ii .*linux-image-[0-9]/ { print $2 }' | sort -V)
CURRENT=$(echo "$KERNELS" | sed 's/\ /\n/' | grep $CURRENT_KERNEL | sed 's/linux-image//' | xargs -i echo " - linux-image{} linux-headers{}")
WITHOUT_CURRENT=$(echo "$KERNELS" | sed 's/\ /\n/' | grep -v $CURRENT_KERNEL)
LATEST=$(echo "$WITHOUT_CURRENT" | tail -n $KEEP_KERNELS | sed 's/linux-image//' | xargs -i echo " - linux-image{} linux-headers{}")
OLDEST=$(echo "$WITHOUT_CURRENT" | head -n -$KEEP_KERNELS | sed 's/linux-image//' | xargs -i echo " - linux-image{} linux-headers{}")
echo "Current kernel:"
echo -e "$CURRENT\n"
if [ "$LATEST" != "" ]; then
echo "Latest kernels which will NOT be removed:"
echo -e "$LATEST\n"
fi
if [ $REMOVE -eq 1 ] ; then
if [ "$OLDEST" != "" ]; then
echo "Removing old kernels:"
echo -e "$OLDEST\n"
echo "$KERNELS" | grep -v $CURRENT_KERNEL | head -n -$KEEP_KERNELS | sed 's/linux-image//' | xargs -I {} sudo apt-get -y purge linux-image{} linux-headers{}
else
echo "There are no older kernels to remove."
fi
else
if [ "$OLDEST" != "" ]; then
echo "Old kernels which will be removed:"
echo -e "$OLDEST\n"
echo "Use $CMD -r -l $KEEP_KERNELS to remove the listed kernels."
else
echo "There are no older kernels to remove."
fi
fi
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13177
|
NicTheQuick schrieb: Danke dafür! Das sind alles gute Punkte. Vor allem getopt hatte ich so noch nicht gekannt.
getopts ! Das "s" ist wichtig: $ type getopt getopts
getopt is /usr/bin/getopt
getopts is a shell builtin Und das benutzt man so (aus einem Skript von mir): 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | unset OPTARG opt dir keep verbose avlog ts0 ts1
keep=yes
avlog=error
while getopts ':d:krv' opt; do
case "$opt" in
d) dir="$OPTARG"
;;
k) keep=yes
;;
r) unset keep
;;
v) verbose=-v
avlog=warning
;;
:) error "missing parameter to $OPTARG"
;;
\?) error "unknown option: $OPTARG"
;;
esac
done
shift $((OPTIND - 1))
|
Der shift am Ende ist wichtig, damit in $@ nur noch die Dateinamen übrig bleiben.
Ich habe das ganze jetzt mal umgeschrieben:
Die sed und grep in Zeile 74 kannst Du auch zusammen fassen. Ciao robert
|
NicTheQuick
(Themenstarter)
Anmeldungsdatum: 22. Oktober 2007
Beiträge: 144
|
Hm... Aber getopt geht doch genauso gut, oder? Ich hatte mir die Handhabung einfach unter '/usr/share/doc/util-linux/examples' abgeguckt. Dein Beispiel mit getopts hingegen habe ich jetzt noch nicht ganz kapiert.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13177
|
NicTheQuick schrieb: Hm... Aber getopt geht doch genauso gut, oder? Ich hatte mir die Handhabung einfach unter '/usr/share/doc/util-linux/examples' abgeguckt.
Nee, getopt hat oder hatte Probleme, die nicht auf den ersten Blick offenbar sind: Neuanordnung der Optionen Sonderzeichen und Leerzeichen in Argumenten Externer Prozess, tendenziell langsamer und hat keinen Zugriff auf Shell-Interna
Schau mal 🇬🇧 hier.
Dein Beispiel mit getopts hingegen habe ich jetzt noch nicht ganz kapiert.
Dann lass es noch etwas sacken. 😉 Wenn etwas unklar ist, kannst Du ja fragen. Ciao robert
|
NicTheQuick
(Themenstarter)
Anmeldungsdatum: 22. Oktober 2007
Beiträge: 144
|
Ich habe den Code nochmal überarbeitet. Allerdings ist "getopt" immer noch drin. Schande über mein Haupt. 😳 Im alten Code waren jedenfalls noch Fehler drin. Und zwar wurde nur nach Paketen gesucht, die mit 'linux-image' begannen. Bei mir war nun aber der Fall, dass noch jede Menge 'linux-headers'-Pakete da waren. Da diese von meinem Skript nicht erkannt wurden, wurden sie auch nicht deinstalliert. Jetzt habe ich das geändert.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110 | #!/bin/bash
REMOVE=0
KEEP_KERNELS=1
CMD=$(basename "$0")
VERSION="1.2"
USAGE="Usage: $CMD [-h | OPTIONS ]"
function printUsage() {
test "$1" && echo -e >&2 "$CMD: $1"
echo >&2 "$USAGE"
exit 2
}
function printHelp() {
cat << EOF
removeOldKernels version $VERSION
Removing the oldest kernels with one command.
(c) 2013-2015 by Nicolas Göddel
Released without warranty under the terms of the GNU license.
$USAGE
Options:
-h, --help Print help
-r, --remove Remove the oldest kernels except the current
and the last one.
-k, --keep=KEEP Keep that amount of latest kernels and also the
current one.
EOF
exit 0
}
TEMP=$(getopt -o rk:h --long remove,keep:,help -n "$CMD" -- "$@")
if [ $? != 0 ] ; then
printUsage
exit 1
fi
eval set -- "$TEMP"
while true ; do
case "$1" in
-r|--remove)
REMOVE=1;
shift;;
-k|--keep)
KEEP_KERNELS=$2;
shift 2;;
-h|--help)
printHelp;
shift;;
--)
shift;
break;;
*)
printUsage "Invalid option '$1'!";
exit 1;;
esac
done
if [ $KEEP_KERNELS -lt 0 ]; then
KEEP_KERNELS=0
fi
CURRENT_KERNEL_VERSION=$(uname -r | egrep -o "[0-9\.-]+[0-9]")
KERNEL_PACKAGES=$(dpkg -l | egrep -o "linux-(image|headers)-[0-9][^ ]+")
KERNEL_VERSIONS=$(echo "$KERNEL_PACKAGES" | egrep -o "[0-9][0-9\.-]+[0-9]" | sort -Vu)
WITHOUT_CURRENT=$(echo "$KERNEL_VERSIONS" | grep -v "^$CURRENT_KERNEL_VERSION$")
KEEP_VERSIONS=$(echo "$WITHOUT_CURRENT" | head -n $KEEP_KERNELS)
REMOVE_VERSIONS=$(echo "$WITHOUT_CURRENT" | tail -n +$(( $KEEP_KERNELS+1 )))
function join { local IFS="$1"; shift; echo "$*"; }
REMOVE_VERSIONS_REGEX=$(join \| ${REMOVE_VERSIONS//./\\.})
REMOVE_PACKAGES=$(echo "$KERNEL_PACKAGES" | egrep "$REMOVE_VERSIONS_REGEX")
echo "Current kernel version:"
echo -e "$CURRENT_KERNEL_VERSION\n"
if [ "$KEEP_VERSIONS" != "" ]; then
echo "Latest kernels which will NOT be removed:"
echo -e "$KEEP_VERSIONS\n"
fi
if [ $REMOVE -eq 1 ] ; then
if [ "$REMOVE_VERSIONS" != "" ]; then
echo "Removing old kernels:"
echo -e "$REMOVE_VERSIONS\n"
echo "The following packages will be removed:"
echo "$REMOVE_PACKAGES"
sudo apt-get purge $(join " " $REMOVE_PACKAGES)
else
echo "There are no older kernels to remove."
fi
else
if [ "$REMOVE_VERSIONS" != "" ]; then
echo "Old kernels which will be removed:"
echo -e "$REMOVE_VERSIONS\n"
echo "Use $CMD -r -k $KEEP_KERNELS to remove the listed kernels."
else
echo "There are no older kernels to remove."
fi
fi
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13177
|
NicTheQuick schrieb: Ich habe den Code nochmal überarbeitet. Allerdings ist "getopt" immer noch drin. Schande über mein Haupt. 😳
Allerdings! Außerdem schreibst Du Variablen des Skriptes groß, was die Unterscheidung zu solchen aus der Umgebung schwerer macht. Wir empfehlen hier immer, Variablen des Skriptes klein zu schreiben. Schön, dass du das "alte" Schätzchen noch hegst und pflegst. 👍 Viele Grüße robert
|
NicTheQuick
(Themenstarter)
Anmeldungsdatum: 22. Oktober 2007
Beiträge: 144
|
So, und wieder eine neue Version. Diesmal mit Variablennamen in CamelCase und getopts, allerdings funktioniert mit letzterem noch etwas nicht so richtig.
| nicolas@tp-w530:~$ removeOldKernels -s
removeOldKernels: Invalid option: -
Usage: removeOldKernels [-h | OPTIONS ]
|
Eigentlich sollte hier "Invalid options: -s" erscheinen. Das tut es aber nicht.
| nicolas@tp-w530:~$ removeOldKernels -k
removeOldKernels: Invalid option: -
Usage: removeOldKernels [-h | OPTIONS ]
|
Und hier sollte "Missing argument for Option -k!" erscheinen. Das tut es aber auch nicht. Hat dazu jemand eine Idee? Hier ist nochmal der komplette Code.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118 | #!/bin/bash
doRemove=false
keepKernels=1
ownCommand=$(basename "$0")
version="1.3"
usage="Usage: $ownCommand [-h | OPTIONS ]"
function printUsage() {
test "$1" && echo -e >&2 "$ownCommand: $1"
echo >&2 "$usage"
exit 2
}
function printHelp() {
cat << EOF
removeOldKernels version $version
Removing the oldest kernels with one command.
(c) 2013-2015 by Nicolas Göddel
Released without warranty under the terms of the GNU license.
$usage
Options:
-h, --help Print help
-r, --remove Remove the oldest kernels except the current
and the last one.
-k, --keep=KEEP Keep that amount of latest kernels and also the
current one.
EOF
exit 0
}
OPTERR=0
while getopts "rk:h" OPTION; do
case "$OPTION" in
r|--remove)
doRemove=true;;
k|--keep)
keepKernels=$OPTARG;;
h|--help)
printHelp;;
\:)
printUsage "Missing argument for Option -$OPTARG!";
exit 1;;
\?)
printUsage "Invalid option: -$OPTARG";
exit 1;;
*)
printUsage "Invalid option '$OPTION'!";
exit 1;;
esac
done
if [ $keepKernels -lt 0 ]; then
keepKernels=0
fi
# Die aktuelle Kernelversion
currentKernelVersion=$(uname -r | egrep -o "[0-9\.-]+[0-9]")
# Alle Pakete, die einen Kernel beinhalten
kernelPackages=$(dpkg -l | egrep -o "linux-(image|headers)-[0-9][^ ]+")
# Eine sortierte Liste aller Versionsnummern, die vorhanden sind
kernelVersions=$(echo "$kernelPackages" | egrep -o "[0-9][0-9\.-]+[0-9]" | sort -Vur)
# Die selbe Liste ohne den aktuellen Kernel
withoutCurrent=$(echo "$kernelVersions" | grep -v "^$currentKernelVersion$")
# Die Liste von Versionen, die nicht gelöscht werden sollen
keepVersions=$(echo "$withoutCurrent" | head -n $keepKernels)
# Die Liste von Versionen, die gelöscht werden sollen
removeVersions=$(echo "$withoutCurrent" | tail -n +$(( $keepKernels+1 )))
# Verkettet alle Elemente eines Arrays zu einem String und nutzt den ersten Parameter
# als Trennzeichen
function join { local IFS="$1"; shift; echo "$*"; }
# Verkettet alle zu löschenden Versionsstrings mit dem Trennzeichen | und escaped
# vorher alle Punkte mit einem Backslash, um eine Regular Expression zu erstellen.
removeVersionsRegEx=$(join \| ${removeVersions//./\\.})
# Filtert anhand der obigen Regular Expression alle zu löschenden Pakete heraus
removePackages=$(echo "$kernelPackages" | egrep "$removeVersionsRegEx")
echo "Current kernel version:"
echo " - $currentKernelVersion"
if [ "$keepVersions" != "" ]; then
echo "Latest kernels which will NOT be removed:"
echo "$keepVersions" | sed 's/^/ - /'
fi
if $doRemove; then
if [ "$removeVersions" != "" ]; then
echo "Removing old kernels:"
echo "$removeVersions" | sed 's/^/ - /'
echo "The following packages will be removed:"
echo "$removePackages" | sed 's/^/ - /'
sudo apt-get purge $(join " " $removePackages)
else
echo "There are no older kernels to remove."
fi
else
if [ "$removeVersions" != "" ]; then
echo "Old kernels which will be removed:"
echo "$removeVersions" | sed 's/^/ - /'
echo "Use $ownCommand -r -k $keepKernels to remove the listed kernels."
else
echo "There are no older kernels to remove."
fi
fi
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13177
|
Du willst $OPTARG und nicht $OPTION.
|
aasche
Anmeldungsdatum: 30. Januar 2006
Beiträge: 14259
|
Werden auch Pakete mit dem Namen linux-image-extra beruecksichtigt?
|
NicTheQuick
(Themenstarter)
Anmeldungsdatum: 22. Oktober 2007
Beiträge: 144
|
rklm schrieb: Du willst $OPTARG und nicht $OPTION.
Ich hab ja $OPTARG, aber trotzdem sehe ich nur den Bindestrich in der Ausgabe. aasche schrieb: Werden auch Pakete mit dem Namen linux-image-extra beruecksichtigt?
Guter Punkt. Dazu einfach Zeile 66 ändern in:
| kernelPackages=$(dpkg -l | egrep -o "linux-(image(-extra)?|headers)-[0-9][^ ]+")
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13177
|
NicTheQuick schrieb: rklm schrieb: Du willst $OPTARG und nicht $OPTION.
Ich hab ja $OPTARG, aber trotzdem sehe ich nur den Bindestrich in der Ausgabe.
Nein, hast Du in Zeile 52 nicht.
|
NicTheQuick
(Themenstarter)
Anmeldungsdatum: 22. Oktober 2007
Beiträge: 144
|
rklm schrieb: NicTheQuick schrieb: rklm schrieb: Du willst $OPTARG und nicht $OPTION.
Ich hab ja $OPTARG, aber trotzdem sehe ich nur den Bindestrich in der Ausgabe.
Nein, hast Du in Zeile 52 nicht.
Ich weiß. Aber die wird auch nie ausgeführt, da der "case" *) nie vorkommt. Im Code ist auch ein Unterschied zu erkennen zwischen "Invalid Option" und "Invalid Option:". 😉
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13177
|
NicTheQuick schrieb: rklm schrieb: NicTheQuick schrieb: rklm schrieb: Du willst $OPTARG und nicht $OPTION.
Ich hab ja $OPTARG, aber trotzdem sehe ich nur den Bindestrich in der Ausgabe.
Nein, hast Du in Zeile 52 nicht.
Ich weiß. Aber die wird auch nie ausgeführt, da der "case" *) nie vorkommt.
Warum hast Du ihn dann aufgeführt? Das hat mich verwirrt: Ich sehe, dass Dein Optstring nicht mit Doppelpunkt anfängt, was das Verhalten ändert. Das hatte ich übersehen, weil ich immer mit Doppelpunkt am Anfang baue und man dann tatsächlich in den Fall läuft ($OPTION ist dann leer). Der Grund, warum Du die Meldung nicht siehst, ist, dass $OPTION "?" enthält und nicht ":", wenn ein Argument fehlt: 1
2
3
4
5
6
7
8
9
10
11
12
13
14 | OPTERR=0
while getopts 'ab:' OPT; do
case "$OPT" in
a) echo "found a";;
b) echo "found b: $OPTARG";;
\?) echo "? OPT=$OPT OPTARG=$OPTARG";;
*) echo "* OPT=$OPT OPTARG=$OPTARG";;
esac
done
shift $((OPTIND - 1))
echo "args: $*"
|
ergibt $ sh x.sh -b a
found b: a
args:
$ sh x.sh -b
? OPT=? OPTARG=
args: OPTERR auf 0 zu setzen hat nur die Wirkung, die Fehlerausgabe der Shell zu unterdrücken, schaltet aber nicht auf "silent error reporting" um wie der führende Doppelpunkt, bei dem dann $OPTION auf Leerstring gesetzt wird, so dass man die beiden Fälle "ungültige Option" und "Optionsargument fehlt" leicht unterscheiden kann. Ich persönlich nutze immer die Version mit dem führenden Doppelpunkt, weil ich das aus genau diesem Grund bequemer finde. ☺
|