Bash Bashing

Aus ConfigWiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
(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%/*}"
löscht alles bis zum ersten / von rechts
+
</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##*/}"
löscht alles bis zum letzten / von links
+
</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  ip=$1
    local  stat=1
+
  local  stat=1
 
   
 
   
    # bash 2:
+
  # 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
+
  # 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:
+
  # bash 3:
    if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
+
  if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
        OIFS=$IFS
+
      OIFS=$IFS
        IFS='.'
+
      IFS='.'
        ip=($ip)
+
      ip=($ip)
        IFS=$OIFS
+
      IFS=$OIFS
        [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
+
      [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
        stat=$?
+
      stat=$?
    fi
+
  fi
    return $stat
+
  return $stat
 
  }
 
  }
 
   
 
   
 
  if valid_ip $IP; then
 
  if valid_ip $IP; then
    echo "IP ist eine IPv4-Adresse"
+
  echo "IP ist eine IPv4-Adresse"
 
  fi
 
  fi
 
</source>
 
</source>

Aktuelle Version vom 29. Juni 2013, 10: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>

Meine Werkzeuge