Bash Bashing
(→IP-Validierung) |
|||
| (5 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
| Zeile 31: | Zeile 31: | ||
| %% | | %% | ||
| Löschen von rechts | | Löschen von rechts | ||
| − | | X="aabcabcc"; ${X%c}; löscht alle c am Ende (funktioniert in Bash 3.2 nicht, wo ist der Fehler?) | + | | X="aabcabcc"; ${X%%c}; löscht alle c am Ende (funktioniert in Bash 3.2 nicht, wo ist der Fehler?) |
|- | |- | ||
| / | | / | ||
| Zeile 78: | Zeile 78: | ||
|} | |} | ||
| − | praktische Beispiele: | + | =====praktische Beispiele===== |
| + | |||
| + | löscht alles bis zum ersten '/' von rechts: | ||
| + | <source lang="bash"> | ||
VERZEICHNIS="${0%/*}" | VERZEICHNIS="${0%/*}" | ||
| − | + | </source> | |
| − | ersetzt: | + | ersetzt externen Aufruf: |
| + | <source lang="bash"> | ||
VERZEICHNIS=$(dirname "$0") | VERZEICHNIS=$(dirname "$0") | ||
| − | + | </source> | |
| + | |||
| + | löscht alles bis zum letzten '/' von links: | ||
| + | <source lang="bash"> | ||
SKRIPTNAME="${0##*/}" | SKRIPTNAME="${0##*/}" | ||
| − | + | </source> | |
| − | ersetzt: | + | ersetzt externen Aufruf: |
| + | <source lang="bash"> | ||
SKRIPTNAME=$(basename "$0") | SKRIPTNAME=$(basename "$0") | ||
| + | </source> | ||
==IP-Validierung== | ==IP-Validierung== | ||
| − | + | <source lang="bash"> | |
function valid_ip() | function valid_ip() | ||
{ | { | ||
| − | + | local ip=$1 | |
| − | + | local stat=1 | |
| − | + | # bash 2: | |
| − | + | # if ( echo $ip | egrep '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' > /dev/null ) ; then | |
| − | + | # bash 3: | |
| − | + | if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then | |
| − | + | OIFS=$IFS | |
| − | + | IFS='.' | |
| − | + | ip=($ip) | |
| − | + | IFS=$OIFS | |
| − | + | [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]] | |
| − | + | stat=$? | |
| − | + | fi | |
| − | + | return $stat | |
} | } | ||
if valid_ip $IP; then | if valid_ip $IP; then | ||
| − | + | echo "IP ist eine IPv4-Adresse" | |
fi | fi | ||
| − | + | </source> | |
Aktuelle Version vom 29. Juni 2013, 09:25 Uhr
Unlesbare Bash-Skripte, unnötige externe Programmaufrufe und überlange Befehlsketten sind vermeidbar. Interessante Beiträge aus der gleichnamigen Beitragsserie des Linux-Magazins und weitere Anregungen folgen hier in Kurzform.
Inhaltsverzeichnis |
[Bearbeiten] cut, sed, grep & Co. vermeiden
Quelle: Folge 5, Linux-Magazin 02/10
[Bearbeiten] Parameter-Expansion
Nach dem Schema ${<Variable><Zeichen><Suchmuster>} erledigt die Bash viele Aufgaben selbst, die sonst mit cut, sed, grep oder awk gelöst werden. Als Zeichen # % / ^ , zulässig, die doppelte Angabe schaltet jeweils in den gierigen Modus und ersetzt alles bis zum letzten Vorkommen des Suchmusters.
| Zeichen | Bedeutung | Beispiel |
|---|---|---|
| # | Löschen von links | X="aabcabcc"; ${X#a}; löscht das erste a |
| ## | Löschen von links | X="aabcabcc"; ${X##a}; löscht alle führenden a (funktioniert in Bash 3.2 nicht, wo ist der Fehler?) |
| % | Löschen von rechts | X="aabcabcc"; ${X%c}; löscht das letzte c |
| %% | Löschen von rechts | X="aabcabcc"; ${X%%c}; löscht alle c am Ende (funktioniert in Bash 3.2 nicht, wo ist der Fehler?) |
| / | Ersetzen (substitude) | X="aabcabcc"; ${X/b/d}; ersetzt 1. b durch d |
| / | Ersetzen (substitude) | X="aabcabcc"; ${X/b}; löscht 1. b |
| // | Ersetzen (substitude) | X="aabcabcc"; ${X//b/d}; ersetzt alle b durch d |
| // | Ersetzen (substitude) | X="aabcabcc"; ${X//b}; löscht alle b |
| funktioniert erst ab Bash 4 | ||
| ^ | Umwandeln in Großbuchstaben (uppercase) | X="aabcabcc"; ${X^a}; wandelt erstes a in A |
| ^^ | Umwandeln in Großbuchstaben (uppercase) | X="aabcabcc"; ${X^^bc}; wandelt alle bc in BC |
| ^^ | Umwandeln in Großbuchstaben (uppercase) | X="aabcabcc"; ${X^^}; wandelt alles in Grossbuchstaben |
| , | Umwandeln in Kleinbuchstaben (lowercase) | X="AABCABCC"; ${X,A}; wandelt erstes A in a |
| ,, | Umwandeln in Kleinbuchstaben (lowercase) | X="AABCABCC"; ${X,,BC}; wandelt alle BC in bc |
| ,, | Umwandeln in Kleinbuchstaben (lowercase) | X="AABCABCC"; ${X,,}; wandelt alles in Kleinbuchstaben |
[Bearbeiten] praktische Beispiele
löscht alles bis zum ersten '/' von rechts: <source lang="bash">
VERZEICHNIS="${0%/*}"
</source> ersetzt externen Aufruf: <source lang="bash">
VERZEICHNIS=$(dirname "$0")
</source>
löscht alles bis zum letzten '/' von links: <source lang="bash">
SKRIPTNAME="${0##*/}"
</source> ersetzt externen Aufruf: <source lang="bash">
SKRIPTNAME=$(basename "$0")
</source>
[Bearbeiten] IP-Validierung
<source lang="bash">
function valid_ip()
{
local ip=$1
local stat=1
# bash 2:
# if ( echo $ip | egrep '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' > /dev/null ) ; then
# bash 3:
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS='.'
ip=($ip)
IFS=$OIFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
stat=$?
fi
return $stat
}
if valid_ip $IP; then
echo "IP ist eine IPv4-Adresse"
fi
</source>