Bash Bashing
Aus ConfigWiki
		(Unterschied zwischen Versionen)
		
		
 (Die Seite wurde neu angelegt: Category:BASH Unlesbare Bash-Skripte, unnötige externe Programmaufrufe und überlange Befehlsketten sind vermeidbar. Interessante Beiträge aus der gleichnamigen B...)  | 
			 (→IP-Validierung)  | 
			||
| Zeile 113: | Zeile 113: | ||
     echo "IP ist eine IPv4-Adresse"  |      echo "IP ist eine IPv4-Adresse"  | ||
  fi  |   fi  | ||
| − | </source>  | + |  </source>  | 
Version vom 19. Dezember 2011, 23:46 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.
cut, sed, grep & Co. vermeiden
Quelle: Folge 5, Linux-Magazin 02/10
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 | 
praktische Beispiele:
VERZEICHNIS="${0%/*}"
löscht alles bis zum ersten / von rechts ersetzt:
VERZEICHNIS=$(dirname "$0")
SKRIPTNAME="${0##*/}"
löscht alles bis zum letzten / von links ersetzt:
SKRIPTNAME=$(basename "$0")
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>