2025-02-18 14:37:26 +01:00

270 lines
9.7 KiB
TeX
Executable File

\section{Variablen}
\subsection{Definition}
\begin{justify}
%\begin{flushleft}
Jede Variable hat einen Namen und einen Wert. Typen kennt die Bash nur eingeschr\"angt. Um eine Variable in einem Bash Script zu definieren, kann der Befehl {\ttfamily declare\index{declare}} benutzt werden.
\listBash
\begin{lstlisting}[captionpos=b, caption=Beispiele]
uws@tux>wert=3+7
uws@tux>echo $wert
3+7
uws@tux>declare -i wert
uws@tux>echo $wert
3+7
uws@tux>wert=3+7
uws@tux>echo $wert
10
uws@tux>declare -u choise
uws@tux>choise=yes
uws@tux>echo $chaoise
YES
uws@tux>declare -l choise
uws@tux>choise=YES
uws@tux>echo $choise
yes
\end{lstlisting}
Hier eine kurze Liste der Typen.
\begin{longtable}[l]{p{1.5cm}p{14.5cm}}
\rowcolor{hellgrau}\multicolumn{1}{l}{\textbf{Attribut}} & \multicolumn {1}{l}{\textbf{Beschreibung}} \\
\hline
\hline
\endfirsthead
\multicolumn{2}{r}{{\bfseries continued from previous page.}} \\
\rowcolor{hellgrau}\multicolumn{1}{l}{\textbf{Attribut}} & \multicolumn {1}{l}{\textbf{Beschreibung}} \\
\hline
\hline
\endhead
\multicolumn{2}{r}{{\bfseries Continued on next page}} \\
\endfoot
\caption{Attribute} \\
\endlastfoot
-p & Zeigt alle Attribute aller Variablen an\\
-i & Arithmetische Auswertung\\
-a & Array Index\\
-A & Array Namen\\
-u & Der Wert wird in Gro"ss buchstaben umgewandelt\\
-l & Der Wert wird in Kleinbuchstaben umgewandelt\\
-r & Nach der Zuweisung kann dieser Wert nicht mehr ver"andert werden, sie ist dann eine Konstante\\
\end{longtable}
\newpage
Weitere Informationen hierzu gibt es auf der Seite \url{http://tldp.org/LDP/abs/html/declareref.html}.
\listBash
\begin{lstlisting}[captionpos=b, caption=Zuweisung mittels Befehl, label=lst:bash]
uws@tux>strMachine="Computer Name: `uname -a | cut -d ' ' -f 2`"
uws@tux>echo $strMachine
Computer Name: tux
\end{lstlisting}
Die auszuf\"uhrenden Befehle stehen zwischen R"uckwertigen Hochkommas.\\
Auch mit {\ttfamily typeset} werden Variablen mit einem Typ definiert. Standardm\"assig werden auch hier Variablen ohne Angabe des Typs als {\ttfamily string} Variable deklariert. Die Angabe eines Wertes ist optional.\\
Die Syntax f"ur {\ttfamily typeset} ist:\\[1ex]
{\ttfamily typset [option] [variable] [=wert]}
\listBash
\begin{lstlisting}[captionpos=b, caption=Beispiel typeset, label=lst:bash]
uws@tux>cat example1.sh
#!/bin/env bash
typeset -i var1=2 # Variable var1 als integer mit einem Wert
typeset +i var1 # Abschalten der definition
\end{lstlisting}
\begin{longtable}[l]{p{1.5cm}p{14.5cm}}
\rowcolor{hellgrau}\multicolumn{1}{l}{\textbf{Option}} & \multicolumn {1}{l}{\textbf{Beschreibung}} \\
\hline
\hline
\endfirsthead
\multicolumn{2}{r}{{\bfseries continued from previous page.}} \\
\rowcolor{hellgrau}\multicolumn{1}{l}{\textbf{Option}} & \multicolumn {1}{l}{\textbf{Beschreibung}} \\
\hline
\hline
\endhead
\multicolumn{2}{r}{{\bfseries Continued on next page}} \\
\endfoot
\caption{Typeset Options} \\
\endlastfoot
-a & Array\\
-i & Integer\\
-r & Konstante (read only)\\
-x & Varaible exportieren\\
-f & Zeigt Funktionen mit ihrer Definition an\\
-fx & Exportiert eine Funktion\\
-F & Zeigt Funktionen ohne ihre Definition an\\
\end{longtable}
%-------------------------------------------------------------------------------
% Variablen laenge
%-------------------------------------------------------------------------------
\subsection{Variablen l\"ange}
Die L\"ange eines Strings, die einer Variable zugewiesen worden ist, kann man folgenderma\ss en ermitteln.
\listBash
\begin{lstlisting}[captionpos=b, caption=Variable l\"ange]
uws@tux>cat varlength.sh
#!/bin/bash
A="$1" X=${#A}
echo -n "*" # Ausgabe ohne newline
printf " Laenge der Variable A: ${X}\n"
uws@tux>./varlength.sh Weihnachten
* Laenge der Variable A: 11
\end{lstlisting}
%-------------------------------------------------------------------------------
% Variablen default
%-------------------------------------------------------------------------------
\subsection{Variablen default}
Falls ein Parameter / Variable nicht gesetzt wird, so kann man ein Default Wert f"ur diese Variable setzen.
\listBash
\begin{lstlisting}[captionpos=b, caption=Variable default]
uws@tux>cat varDefault.sh
#!/bin/bash
MinSize=${1:-50M}
printf "Minimum Size: $MinSize\n"
uws@tux>./varDefault.sh
Minimum Size: 50M
uws@tux>./varDefault.sh 125M
Minimum Size: 125M
\end{lstlisting}
%-------------------------------------------------------------------------------
% Variablen Warnung
%-------------------------------------------------------------------------------
\subsection{Variablen Warnung}
Wenn ein Parameter / Variable nicht definiert wird, so wird dann eine Message ausgegeben. Nicht interktive Shells terminieren anschlie"send.
\listBash
\begin{lstlisting}[captionpos=b, caption=Variable Warnung]
uws@tux>cat varWarnung.sh
#!/bin/bash
FileName=${1:?Missing filename.}
printf "File Name: $FileName\n"
uws@tux>./varWarnung.sh
varWarnung.sh: Zeile 2: 1: Missing filename.
uws@tux>./varWarnung.sh Mail.log
File Name: Mail.log
\end{lstlisting}
%-------------------------------------------------------------------------------
% Array
%-------------------------------------------------------------------------------
\newpage
\subsection{Array}
Ein Array wird mit {\ttfamily declare -a} oder mit {\ttfamily declare -A} definiert. Bei der ersten Zuweisung werden die Werte mit einer Indexnummer versehen und bei der zweiten Zuweisung kann man einen Bezeichner selbst "ubergeben. Die Syntax f"ur die Zuweisung von Werten ist folgenderma\ss en.
\listBash
\begin{lstlisting}[captionpos=b, caption=Syntax Array]
declare -a <arrayname>
arrayname=(wert1 wert2 wert3)
arrayname[indexnr]=wert
\end{lstlisting}
Wird keine Index Nummer bei der Zuweisung der Werte angegeben, so startet die Index Nummer bei {\ttfamily 0} f\"ur den ersten Wert.
\listBash
\begin{lstlisting}[captionpos=b, caption=Beispiele Array]
uws@tux>declare -a MyUser=('Harry' 'Paul' 'Walter')
uws@tux>for ((i=0;i<=2;i++)); do echo User: ${MyUser[$i]}; done
User: Harry
User: Paul
User: Walter
uws@tux>echo ${MyUser[@]}
Harry Paul Walter
uws@tux>echo ${!MyUser[@]}
0 1 2
uws@tux># Anstelle von @ kann auch ein * genommen werden
uws@tux>echo ${#MyUser[*]}
3
uws@tux>for i in ${!MyUser[*]}; do echo User: ${MyUser[$i]}; done
User: Harry
User: Paul
User: Walter
uws@tux>#Wert hinzufuegen zum array
uws@tux>MyUser+=('Andrea' 'Silvia')
uws@tux>echo ${MyUser[@]}
Harry Paul Walter Andrea Silvia
uws@tux>#Loeschen von Werten vom array
uws@tux>unset -v MyUser[2]
uws@tux>echo ${MyUser[@]}
Harry Paul Andrea Silvia
uws@tux>declare -A MyText[Start]='Starts here'
uws@tux>MyText['End Text']='The Last one'
uws@tux>echo ${MyValue['End Text']} - ${MyValue[Start]}
The Last one - Starts here
\end{lstlisting}
\newpage
\subsection{Gro\ss - / Kleinbuchstaben}
Seit der Bash Version 4 kann man ganz einfach den Wert einer Variable in Gro\ss - oder in Kleinbuchstaben umwandeln. Es k"onnen der erste oder alle Buchstaben umgewandelt werden. Mit {\ttfamily -u} wandelt alle Buchstaben in Gro\ss buchstaben um und ein {\ttfamily -l} wandelt alle Buchstaben in Kleinschreibung um.
\listBash
\begin{lstlisting}[captionpos=b, caption=Gro\ss - / Kleinbuchstaben]
uws@tux># Umwandeln in Gro\ss buchstaben
uws@tux>declare -u Wert1
uws@tux>Wert1=klein
uws@tux>echo $Wert1
KLEIN
uws@tux># Umwandeln in Kleinbuchstaben
uws@tux>declare -l Wert2
uws@tux>Wert2=GROSS
uws@tux>echo $Wert2
gross
\end{lstlisting}
Soll der erste Buchstabe umgewandelt werden oder alle Buchstaben, kann man das folgenderma"sen machen.
\listBash
\begin{lstlisting}[captionpos=b, caption=Werte umwandeln]
uws@tux>an=paulchen
uws@tux>echo ${an^}
Paulchen
uws@tux>echo ${an^^}
PAULCHEN
uws@tux>echo ${an^^c}
paulChen
uws@tux>PAULCHEN
uws@tux>echo ${an,}
pAULCHEN
uws@tux>echo ${an,,}
paulchen
uws@tux>echo ${an,,U}
PAuLCHEN
\end{lstlisting}
\newpage
%-------------------------------------------------------------------------------
% Subsection: String-Operationen
%-------------------------------------------------------------------------------
\subsection{String-Operationen}
In der nachfolgenden Tabelle werden die String-Operationen aufgelistet.
\begin{longtable}[l]{p{4.0cm}p{12.0cm}}
\rowcolor{hellgrau}\multicolumn{1}{l}{\textbf{Operation}} & \multicolumn {1}{l}{\textbf{Bedeutung}} \\
\hline
\hline
\endfirsthead
\multicolumn{2}{r}{{\bfseries continued from previous page.}} \\
\rowcolor{hellgrau}\multicolumn{1}{l}{\textbf{Operation}} & \multicolumn {1}{l}{\textbf{Bedeutung}} \\
\hline
\hline
\endhead
\multicolumn{2}{r}{{\bfseries Continued on next page}} \\
\endfoot
\caption{String-Operationen} \\
\endlastfoot
\verb|${#var}| & L"ange von \verb|${var}| (Variablenwert) in Zeichen \\
\verb|${var:-text}| & "text, wenn var leer oder nicht existiert, sonst \verb|${var}| \\
\verb|${var:+text}| & \verb|""|, falls var leer oder nicht existiert, sonst "text" \\
\verb|${var:=text}| & var="text" falls var leer oder nicht existiert \\
\verb|${var:offset:länge}| & \verb|${var}| ab Position offset vom Anfang (wenn negativ: vom Ende) mit (optional) l"ange Zeichen \\
\verb|${var:#muster}| & \verb|${var}| ohne muster am Anfang (minimale "Ubereinstimmung) \\
\verb|${var:##muster}| & \verb|${var}| ohne muster am Anfang (maximale "Ubereinstimmung) \\
\verb|${var:%muster}| & \verb|${var}| ohne muster am Anfang (minimale "Ubereinstimmung) \\
\verb|${var:%%muster}| & \verb|${var}| ohne muster am Anfang (maximale "Ubereinstimmung) \\
\verb|${var/muster}| & \verb|${var}| ohne das erste muster \\
\verb|${var//muster}| & \verb|${var}| ohne alle muster \\
\verb|${var/muster/text}| & \verb|${var}|, wobei das erste muster durch text ersetzt wurde \\
\verb|${var//muster/text}| & \verb|${var}|, wobei alle muster durch text ersetzt wurden \\
\end{longtable}
%\end{flushleft}
\end{justify}