Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
|
becki:linux:bash [2012-02-27 15:06] becki |
becki:linux:bash [2016-03-03 11:25] (aktuell) becki [File Inclusion, Command Execution] |
||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== Bash Programming ====== | + | ====== Bash Programming == |
| + | ===== Documentation == | ||
| + | - [[kman>man1/bash.1|Bash man page]] | ||
| + | - [[http://tldp.org/LDP/abs/html/|Advanced Bash-Scripting Guide]] | ||
| ===== File Inclusion, Command Execution == | ===== File Inclusion, Command Execution == | ||
| Zeile 13: | Zeile 16: | ||
| **command** | **command** | ||
| - | when the shell encounters a command, it forks off a child process to actually execute the command (external commands only; from abs-guide) FIXME: Is this true? Isn't this ''%%command &%%''? | + | when the shell encounters a command, it forks off a child process to actually execute the command (external commands only; from abs-guide). Parent script blocks until child process ends |
| + | |||
| + | **command &** | ||
| + | |||
| + | forks off a child process to execute the command and put child process into background so that the parent script continues immediately | ||
| **eval command ...** | **eval command ...** | ||
| Zeile 20: | Zeile 27: | ||
| For me useful if command contains spaces witch are protected by single quotes, eg ''%%wget -S --header'Content-Type: application/json'%%''. Without eval, ''%%--header'Content-Type:%%'' and ''%%application/json'%%'' would be interpreted as 2 single arguments | For me useful if command contains spaces witch are protected by single quotes, eg ''%%wget -S --header'Content-Type: application/json'%%''. Without eval, ''%%--header'Content-Type:%%'' and ''%%application/json'%%'' would be interpreted as 2 single arguments | ||
| + | |||
| + | ===== Subshells == | ||
| + | |||
| + | FIXME | ||
| + | |||
| + | ===== Coprocesses == | ||
| + | |||
| + | The following example starts a shell function as a coproc and uses the coproc to manipulate a string: | ||
| + | |||
| + | <code bash> | ||
| + | #!/bin/bash | ||
| + | |||
| + | test_coproc() { | ||
| + | read rein | ||
| + | echo ">$rein<" | ||
| + | } | ||
| + | |||
| + | coproc test_coproc | ||
| + | |||
| + | echo "Hallo" >&${COPROC[1]} | ||
| + | read -u ${COPROC[0]} rein | ||
| + | echo "$rein" | ||
| + | #cat <&${COPROC[0]} # alternative | ||
| + | </code> | ||
| + | |||
| + | ===== Expansion == | ||
| + | |||
| + | FIXME doc ''*'' and ''?'' | ||
| + | |||
| + | <code bash> | ||
| + | echo {a,}quota.{group,user}.new | ||
| + | # prints: aquota.group.new aquota.user.new quota.group.new quota.user.new | ||
| + | # without any regard to the content of the working directory | ||
| + | </code> | ||
| ===== Variables == | ===== Variables == | ||
| + | |||
| $meli is a shortcut for ${meli} | $meli is a shortcut for ${meli} | ||
| Zeile 79: | Zeile 121: | ||
| echo ${app[appix]} # XINE | echo ${app[appix]} # XINE | ||
| </code> | </code> | ||
| + | |||
| + | ===== Maps == | ||
| + | |||
| + | See http://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash | ||
| ===== Loops == | ===== Loops == | ||
| Zeile 141: | Zeile 187: | ||
| ===== Functions == | ===== Functions == | ||
| + | ==== Parameters == | ||
| + | FIXME | ||
| <code bash> | <code bash> | ||
| - | query() { | + | myfunc() { |
| - | echo $*; echo $@; echo $1 | + | echo $* #-> eins zwei drei |
| + | echo $@ #-> eins zwei drei | ||
| + | echo $1 #-> eins | ||
| } | } | ||
| - | query # call the function | + | myfunc eins zwei drei # call the function |
| + | </code> | ||
| + | |||
| + | ==== Exit Status and return Value == | ||
| + | |||
| + | The exit status may be explicitly specified by a return statement, otherwise it is the exit status of the last command in the function. Exit status can be checked with ''$?''. | ||
| + | |||
| + | Here is a method to return a string along with the exit status: | ||
| + | |||
| + | <code bash> | ||
| + | myfunc() { | ||
| + | echo "Hello $1" | ||
| + | } | ||
| + | |||
| + | res=$(myfunc 'crazy world') # Oddly no quotes necessary in bash and ash | ||
| + | echo ">>$res<<" | ||
| + | </code> | ||
| + | |||
| + | By using a separator (tab) and the cut command it is possible to return more than one value: | ||
| + | |||
| + | <code bash> | ||
| + | myfunc() { | ||
| + | echo -e "EINS\tZWEI" | ||
| + | } | ||
| + | |||
| + | buf=$(myfunc) | ||
| + | eins=$(echo "$buf" | cut -f1) | ||
| + | zwei=$(echo "$buf" | cut -f2) | ||
| + | |||
| + | echo "$eins - $zwei" #-> EINS - ZWEI | ||
| </code> | </code> | ||