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

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, 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
	
	---------------------------------------
	#!/bin/bash
	verz=$(ls test)
	echo $*

	f2=${2}
	echo ${verz}

	# ersetze alte Parameter auf den alten Parameter $2 kann jetzt  
	set test.sh  b c d e
	#auf den alten Parameter $2 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.



<