--- gitea: none include_toc: true --- # Bash Scripting Bash (für Bourne-again shell) ist eine freie Unix-Shell und Teil des GNU-Projekts. There are some conventions to follow to ensure that your computer is able to find and execute your Bash scripts. The beginning of your script file should start with `#!/bin/bash` on its own line. This tells the computer which type of interpreter to use for the script. When saving the script file, it is good practice to place commonly used scripts in the `~/bin/` directory. The script files also need to have the “execute” permission to allow them to be run. To add this permission to a file with filename: script.sh use: `$ chmod +x script.sh`. To ensure that scripts in `~/bin/` are available, you must add this directory to your `PATH` within your configuration file: `PATH=~/bin:$PATH`. The configuration file is `~/.bashrc` (Linux) or `~/.bash_profile` (OSX). Now any scripts in the `~/bin` directory can be run from anywhere by typing the filename. ## Variable ``` greeting="Hello" echo $greeting ``` ## Conditionals A complete conditional in a bash script uses the following syntax: ``` if [ $index -lt 5 ] then echo $index else echo 5 fi ``` Bash scripts use a specific list of operators for comparison. Here we used -lt which is “less than”. The result of this conditional is that if $index is less than 5, it will print to the screen. If it is 5 or greater, “5” will be printed to the screen. Here is the list of comparison operators for numbers you can use within bash scripts: ``` Equal: -eq Not equal: -ne Less than or equal: -le Less than: -lt Greater than or equal: -ge Greater than: -gt Is null: -z ``` When comparing strings, it is best practice to put the variable into quotes ("). This prevents errors if the variable is null or contains spaces. The common operators for comparing strings are: ``` Equal: == Not equal: != ``` For example, to compare if the variables foo and bar contain the same string: `if [ "$foo" == "$bar"]` ## Loops ### for loop ``` for word in $paragraph do echo $word done ``` ### while/until loops Within bash scripting until and while are very similar. while loops keep looping while the provided condition is true whereas until loops loop until the condition is true. ``` while [ $index -lt 5 ] do echo $index index=$((index + 1)) done until [ $index -eq 5 ] do echo $index index=$((index + 1)) done # example: #!/bin/bash first_greeting="Nice to meet you!" later_greeting="How are you?" greeting_occasion=0 while [ $greeting_occasion -lt 3 ] do if [ $greeting_occasion -lt 1 ] then echo $first_greeting else echo $later_greeting fi greeting_occasion=$((greeting_occasion + 1)) done ``` ## arrays ### declare ``` declare ELEMENTS=("value1" "value2") ``` ### loop values ``` for e in "${ELEMENTS[@]}"; do echo "$e" done ``` ### associative arrays ``` declare ELEMENTS=(["key1"]="value1" ["key2"]="value2") # loop keys: for e in "${!ELEMENTS[@]}"; do echo "$e" done # loop values: for e in "${ELEMENTS[@]}"; do echo "$e" done ``` ## User Input ### Read ``` echo "Guess a number" read number echo "You guessed $number" ``` ### Options ``` #!/bin/bash # Bash Menu Script Example PS3='Please enter your choice: ' options=("Option 1" "Option 2" "Option 3" "Quit") select opt in "${options[@]}" do case $opt in "Option 1") echo "you chose choice 1" ;; "Option 2") echo "you chose choice 2" ;; "Option 3") echo "you chose choice $REPLY which is $opt" ;; "Quit") break ;; *) echo "invalid option $REPLY";; esac done ``` ## access files ``` files=/some/directory/* # You can then iterate through each file and do something. Here, lets just print the full path and filename: for file in $files do echo $file done ``` ### iterate file line by line assuming you have a file `delete.txt` with id's line by line. ``` #!/bin/bash input="delete.txt" while IFS= read -r line do mysql -uroot -pD66-twcpaeb -e "use atom; delete from object where id = $line" done < "$input" ``` ## echo to console AND log file ``` echo "Some console and log file message" | tee /home/user/logfile.log ```