Bash Scripting can be rather difficult at first, so these notes are an attempt to establish some basics in understanding. This won't go into too much details, but rather is a follow along of the most important takeaways from the https://guide.bash.academy/commands/ section thus far. # A side note: you can append to the directories your bash shell looks for shell scripts by adding a :/path/to/shell_scripts to your $PATH in your .bashrc A standard if statement that checks to see if you cannot remove hello.txt, and if not, then a message is sent to standard error(2), then the exit command is sent, and the if statement ends. if ! rm hello.txt; then echo "Couldn't delete hello.txt." >&2; exit 1; file A shorter version of the same command using the control operator (||): rm hello.txt || { echo "Couldn't delete hello.txt." >&2; exit 1; } Create a file called myfiles.ls if any standard output (1) is produced by the command ls, if not, and a standard error(2) is produced, then send the standard error output to a file in this directory(./) called myerrors.txt ls >myfiles.ls 2>./myerrors.txt Create a file called myfiles_or_myerrors.txt which takes the output of ls sermthing and creates that file with the output of either the successful standard output(1) or the standard error(2) ls sermthing >myfiles_or_myerrors.txt 2>&1 Echo into a file called world in our home directory the phrase Hello(note that if world doesn't exist, it will be created) echo Hello >~/world If you wished to append to our world file above, rather than rewriting it, use the append (>>) syntax instaed of the write(>) syntax. echo World >>~/world cat world Hello World Take the results of ping 127.0.0.1 and write that to a file called results, whether it has a standard output(1) result or a standard error result(2) ping 127.0.0.1 >results 2>&1 A shorter version of this would be written like so ping 127.0.0.1 &>results Assigning temporary variables in bash is as simple as using the equal syntax name="Linus" echo "Hello $(name)!" Hello Linus! We can also use curly braces to refer to this. echo "Hello ${name}!" Hello Linus! Let's say we wanted to only refer to what followed before or after a specific character, this can be done like so: name="Britta" time=23.73 echo "$name's current record is ${time%.*} seconds and ${time#*.} hundredths." Britta's current record is 23 seconds and 73 hundredths. Another example is using it with letters to make this more clear: echo "$name's name is ${name%i*} before the i and ${name#*i} after the i." Britta's name is Br before the i and tta after the i. Capitalize the first word of the variable greeting. greeting="hello world" echo "${greeting^}" Hello world Replace the first space character with the string " big " greeting="hello world" greeting="${greeting/ / big }" echo $greeting hello big world Redirect the contents of $greeting into a filename of the same name, but with underscores(_) instaed of spaces( ) ending in .txt greeting="hello big world" echo $greeting > "${greeting// /_}.txt" Show the contents of the variable greeting with the middle word fully upper-cased. greeting="hello big world" # Assigns the middle variable to everything before the last space. middle="${greeting% *}" echo $middle hello big # Reassigns the middle variable to everything in it currently, but everything after the first space is deleted. middle="${middle#* }" echo middle big # Now we can capitalize our middle word in the phrase like so: echo "${greeting%% *} ${middle^^} ${greeting##* }" hello BIG world # Note the difference if we omit the double signs: echo "${greeting% *} ${middle^^} ${greeting#* }" hello big BIG big world This is because the double percent(%%) and double hashtags(##) will double omit the spaces, meaning that it will omit the spaces as many times as there is %% or ##. # To open a new bash shell and then output echo $1, where 'Hello World!' is passed in as the argument for $1 bash -c 'echo "$1"' -- 'Hello World!' Hello World! # To start a bash shell that takes in any number of arguments, and echos back the number of arguments passed. bash -c 'echo "$#"' -- 1 2 'The Third' 3 # To start a bash shell that shifts a positional parameter away and then ouitputs the first, passing in arguments 1, 2, and The Third bash -c 'shift; echo "$1"' -- 1 2 'The Third' 2 # To start a bashs hell that outputs the last argument passed in and pass in the arguments 1, 2, and The Third. bash -c 'echo "${@: -1}"' -- 1 2 'The Third' The Third # Arrays Arrays in bash are created using parentheses () braces. They can contain any files, variables, numbers, etc. They are separated by spaces and thusly, like a bash command, must be delineated using quotation marks "" in order to delineate specific files, especially when spaces are included in the filename. Here's an example: files=( myscript hello.txt "05 Between Angels and Insects.ogg") We can then access these elements in the array using the echo command like so: echo "${files[0]}" myscript echo "${files[1]}" hello.txt echo "${files[2]}" '05 Between Angels and Insects.ogg' echo "${files[@]}" myscript hello.txt '05 Between Angels and Insects.ogg' # Note that the above can also be done by substituting @ with *, but because of how dangerous and "greedy" the * argument can be, it is best avoided in favor of @ # Note that if we just try to echo files, it will only return the first element of the array. echo "$files" myscript We can also append(push) onto the array, as well as use a few other interesting array methods files+=( self.png ) echo "${files[@]}" myscript hello.txt '05 Between Angels and Insects.ogg' self.png Assigns an array of all txt files to an array called files. files=(*.txt) Remove a specific element of an array echo "${files[@]}" myscript hello.txt '05 Between Angels and Insects.ogg' self.png unset "files[3]" echo "${files[@]}" myscript hello.txt '05 Between Angels and Insects.ogg' # As noted above the * argument is dubious and should always be used with caution, however in the example given above when comparing it with @, it is rather innocuous, and in certain situations where it is used for trivial purposes, it can be quite useful, such asi n the following example: names=("Susan Quinn" "Anne-Marie Davis" "Mary Tate") echo "Invites sent to: <$[names[*]]>." Invites were sent to: # The following is interesting, the $IFS shell variable is usually set to a space, but in this case we set it to a comma. Note the opening parentheses without any equal operator, this indicates opening up what is called a "subshell" in which the global shell variable is changed within a localized SCOPE, and is only equivalent to the comma within the context of that scope (i.e. when the parentheses close) ( IFS=','; echo "invites sent to: <${names[*]}>." ) Invites were sent to: . #### LEFT OFF AT THE END OF VARIABLES, STARTING NEXT AT TESTS AND CONDITIONALS #### https://guide.bash.academy/conditionals/ #### CONDITIONALS #### # Here let's just jump right in with a simple example of an if statement that evalutates user input: read -p "Would you like some breakfast?[y/n]: " Would you like some breakfast?[y/n]: (user inputs y) echo $REPLY y # Now let's evaluate this with a simple if statement if [[ $REPLY = y ]]; then echo "Here you go, an egg sandwich" else echo "Here, you should at least have some coffee." fi # And of course the reponse is based off of whether the user passed y/n to the original read statement # This can be chained so that the response is immediately evaluated upon response like so: read -p "Breakfast?[y/n]: "; if [[ $REPLY = y ]]; then echo "Here you go, an egg sandwich"; else echo "Here, you shoudl at leats have some coffee."; fi #### LOOPS #### That's it for conditionals! (short chapter!) Next up is Loops, which can be found at https://guide.bash.academy/loops This section was not yet completed at the time of this writing, so instead we went to gokicker.com and picked up their Bash for Professionals free book pdf (see ~/Documents/Code/programming_books) We picked up for loops at section 10.3: A simple for loop can be displayed as such: arr=(a b c d e f) for i in "${arr[@]}" ; do echo "$i" done # Continue on at 13.1 of Bash Notes for Professionals from GoalKicker.com