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.
       Das Kommando $(cat file) kann durch die schnellere (builtin)
        $(< file>) ersetzt werden.

       Es gibt 2 Formen:
              `command`                    #alte Form
           oder
              $(command)                   # neue Form  bash, ksh


       
  • 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.
    
    Allgemeine Form         Beispiel
      ${parameter}           ${0}         	Scriptbezeichnung
      			${1}         	Erster Übergabeparameter
      			${feld}
    
      ${#parameter}  	${#*}        	Anzahl der übergebenen  Parameter
      			${#@}         	dto
      			${#feld}     	Länge der Valueangabe des  Parameters Feld
      ${#parameter[*]}	${#array[*]} 	Anzahl der Elemente der  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
    
    
    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, an-
    			schliessend 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
             

    ${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
    
    

    ${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.

    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
    
    Der : ist in allen vorstehenden Substitutionen optional.