====== Shell or Bash Scripts ====== |Shebang|Header, which tells where the interpreter is located #!/bin/sh | http://stackoverflow.com/questions/10376206/what-is-the-preferred-bash-shebang | |Sourcing| launch script in a new shell using point with an empty space between sript path Souring: . path/to/script.sh vs Execute in current shell: ./path/to/script.sh | http://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script-and-sourcing-a-bash-scrip | ===== Guides===== |https://www.shellcheck.net/|Check the syntax of the shell live| |http://www.artificialworlds.net/blog/2012/10/17/bash-associative-array-examples/| | |https://linuxconfig.org/bash-scripting-tutorial| | |http://www.tldp.org/LDP/Bash-Beginners-Guide/html/Bash-Beginners-Guide.html#chap_11| | |http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html| | ===== Executing or Sourcing the script===== Sourcing. Execute in the **CURRENT** shell . path/to/script.sh Executing. Execute in a **NEW** shell - e.g. cd doesn't modify current shell's path ./path/to/script.sh ===== Syntax ===== ==== declare Function==== Returning result is done via **echo** #!/bin/bash #Define bash global variable #This variable is global and can be used anywhere in this bash script VAR="global variable" function bash { #Define bash local variable #This variable is local to bash function only local VAR="local variable" echo $VAR } echo $VAR bash # Note the bash global variable did not change # "local" is bash reserved word echo $VAR == declare Array== Small a!!! declare -a map map[1]="myvalue" map[1]="myvalue2" echo ${map[1]} ==== declare Map ==== Big A!!! declare -A map map[test]="myvalue" map[test2]="myvalue2" echo ${map[test2]} ==== iterate array keys ==== Access via **${!array[@]}** for i in "${!array[@]}" do echo "key : $i" echo "value: ${array[$i]}" done ==== dereference an array / map value ==== ${ARRAY[2]} ${map[key1]} == If Else == * Empty spaces after the parenthesis are critical: **[ $a==$b ]** * # check if it is the root device if [ $device_name==$root_device_name ] then echo "$device_name is root" else echo "NOT root" fi ==== Command Substitution ==== Command substitution allows the output of a command to replace the command itself. Command substitution occurs when a command is enclosed like this: $(command) or like this using backticks: `command` ==== Input from command line ==== If a command expects **a file** as input - one can pass input from STDOUT instead, without storing the output to a file first by using following syntax **oc create -f** expects a file here. oc process -f build/my-build-template.yaml GITSERVER=$GITSERVER | oc create -f - oc process -f build/my-build-template.yaml GITSERVER=$GITSERVER | oc create -f /dev/stdin ==== Double-Dash -- in Shell commands ==== A double-dash in a shell command signals the end of options and disables further option processing. https://www.baeldung.com/linux/double-dash-in-shell-commands # If we use the same approach, we'll receive an error: # That's because grep treats "--hello" as a multi-character command option. grep "--hello" data.txt #works grep -- --hello data.txt