Bash Bashing
 (→IP-Validierung)  | 
			|||
| (3 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==  | ||
| Zeile 93: | Zeile 102: | ||
  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>  | </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>