Substitution

Command Substitution
       Bei der Command  substitution  ersetzt der Output des ausgeführten
       Kommandos auf Standard-Output den Kommandonamen. 
       Dabei werden alle    new-line am Zeilenende gelöscht.
      

       Es gibt 2 Formen:
              `command`             #alte Form
           oder
              $(command)            # neue Form  bash, ksh
        
              $(ls -l)				# Directorylisting anzeigen	
              $(cat  /etc/fstab)    # Datei /etc/fstab anzeigen
       
        Das Kommando $(cat file) kann durch die schnellere (builtin)
        $(< file) ersetzt werden.
        $(< /etc/fstab)              # Datei /etc/fstab anzeigen

       
  • Kommando-Substitutionen dürfen geschachtelt werden
  • Wenn die Substitution in Gänsefüßchen gesetzt wurde, erfolgt keine Expandierung von Pfadnamen
  • Kommando-Substitutions dürfen in beiden Formen geschachtelt werden. In der alten Form müssen aber die inneren `(backticks) maskiert werden. Die neue Form ist da wesentlich benutzerfreundlicher.
Besteht der Name des Parameter/Variablen aus mehreren Zeichen, so muss
er in geschweifte Klammern eingeschlossen werden, wenn dahinter ein Buchstabe,
eine Ziffer oder ein Underscrore folgt, das nicht Teil des Namens ist.
Es ist sinnvoll in den Scripts immer {} zu verwenden, 

Allgemeine Form Beispiel
  ${parameter}  ${0}   Scriptbezeichnung
			 ${1}   Erster Übergabeparameter
  			 ${feld}

  ${#parameter}  ${#*}  Anzahl der übergebenen Parameter
 		 ${#@}         	dto
		 ${#feld} Länge der Valueangabe des 
		          Parameters/Variable Feld
  			     
  ${#parameter[*]} ${#array[*]}	Anzahl Elemente Tabelle array
  ${parameter:=word}            Defaultvalue zuweisen
  ${parameter:-word}            Defaultvalue benutzen
  $parameter:+word}  		Use alternate Value
  ${parameter:?word}            Display  Error  if  Null or Unset
  ${parameter:offset}           Substring  Expansion
  ${parameter:offset:length}    Substring  Expansion

Substition

Bei der Substituierung werden Teile des Parameters ersetzt.
Eigentlich ist der : in der Syntax optional.
Ich hatte aber auch schon Probleme, das die bash ihn aber nicht haben wollte.

substitute Defaults

${parameter:=word} Defaultvalue zuweisen Diese Form darf nicht auf positional Parameter angewendet werden. Ist der Parameter nicht gesetzt oder seine Länge ist Null, so wird der Parameter auf word gesetzt, anschliessend wird substituiert.
    	print ${d:-$(date +%d.%m.%y)}
	10.01.94
	print  $d
	10.01.94


${parameter:-word} Defaultvalue benutzen Wenn der Parameter gesetzt ist und seine Länge ist nicht Null, so wird der Parameter substituiert, andernfalls word . Diese Form kann gut für die Vergabe von einem Default verwendet werden. vi ${1:-defdatei} Wurde eine Datei als Parameter 1 übergeben, so wird der vi damit aufgerufen, andernfalls wird defdatei verwendet. echo ${d:-$(pwd)}
${parameter:+word} Use alternate Value Ist der Parameter gesetzt und seine Länge ist nicht Null, so wird word substituiert. Andernfalls wird nichts substituiert set a b c print $3 c print ${3:+alternate value} alternate value print $3 c ---------------------------------------
line:  code : Parameter
1:
 
#!/bin/bash
verz=$(ls test)
echo $*

f2=${2}
echo ${verz}

# ersetze alte Parameter auf den alten Parameter  kann jetzt  
set test.sh  b c d e
#auf den alten Parameter  kann jetzt nicht mehr zugegriffen werden
echo $*

echo $3 
# Ist der Parameter gesetzt und seine Länge  ist nicht Null,  so wird word substituiert.
echo ${3+${f2}}


detlef@i7-graf-st-dh:~/script_tests$ ./par_sub_1.sh bla blup blubber
bla blup blubber
files.txt leer.txt versuch.txt
test.sh b c d e
c
blup
detlef@i7-graf-st-dh:~/script_tests$ 
         

${parameter:?word} Display Error if Null or Unset Wenn NULL oder unset Fehlermeldung ausgeben Ist der Parameter gesetzt und seine Länge ist nicht Null, so wird der Parameter substituiert. Andernfalls wird word ausgegeben und die Shell mit exit verlassen. Fehlt word, so wird eine Standardmeldung ausgegeben.

         unset a
         print ${x:?"Abbruch da Parameter fehlt"}
	bash:  x:   Abbruch da Parameter fehlt


	print ${a:?}
	bash:   a:  parameter null or unset

Remove Pattern

remove left pattern

${parameter:#pattern} Remove small left pattern Wenn das pattern mit dem Anfang des Inhalts von parameter übereinstimmt, so wird nur der Rest des Parameters substituiert, andernfalls wird der Inhalt des Parameters substituiert.
	geraet=/dev/ttyd01
	print  ${geraet:#/dev/}
	ttyd01






         $ pwd
	/usr/hahn/unix/ksh             Hier wir nur der relative Pfad ab dem
	$ echo ${PWD:#$HOME}           Homedirectory ausgegeben
	unix/ksh





	$ cd /usr2/user/unix0
         $ pwd
         /usr2/user/unix0
	$ echo ${PWD:#$HOME}           Hier wird der gesamte Pfad ausgegeben, da
	/usr2/user/unix0               der verdere Teil nicht mit $PWD übereinstimmt

${parameter:##pattern} remove large left pattern der größtmögliche passende vordere Teil soll entfernt werden. Hier wird i.d.R. mit Metazeichen gearbeitet
  	$ pwd
	/usr/hahn/unix/ksh
	$ echo ${PWD:##*/}              Eignet sich gut, um den reinen Dateinamen
	ksh                             oder das letzte Verzeichnis zu isolieren.

remove right pattern $parameter:%pattern} remove small right pattern Wenn das pattern mit dem Ende des Inhalts von parameter übereinstimmt, so wird der vordere Teil des Parameters substituiert. Mit anderen Worten, der übereinstimmende hintere Teil wird abgeschnitten.
 	geraet=/dev/ttyd01
 	print  ${geraet:%/ttyd01}
	/dev

$parameter:%%pattern} remove large right pattern der größtmögliche passende hintere Teil soll entfernt werden Hier wird i.d.R. mit Metazeichen gearbeitet
	$ x=usr/hahn/unix/ksh      	# Achtung kein / am Anfang
	$ echo ${x:%%/*}           	#/gefolgt von beliebigen Zeichen
	usr
${parameter:offset} Substring Expansion ${parameter:offset:length} Substring Expansion Expandiert ab dem Offset zu der angegebenen Zeichenlä;nge oder bis zum Ende . length und offset sind arithmetische Ausdr&ücke. Length muß; dabei zu einem Wert >= 0 expandieren. Wenn offset negativ ist, wird er vom Ende des Parameters verwendet. parameter is @, the result is length positional parameters beginning at offset. If parameter is an array name indexed by @ or *, the result is the length members of the array beginning with ${parameter[offset]}. Substring indexing is zero-based unless the positional parameters are used, in which case the indexing starts at 1. ${!prefix*} Expands to the names of variables whose names begin with prefix, separated by the first character of the IFS special variable.

<