diff --git a/.vscode/markdown-styles.css b/.vscode/markdown-styles.css index 90ad763..fc5deeb 100644 --- a/.vscode/markdown-styles.css +++ b/.vscode/markdown-styles.css @@ -26,6 +26,10 @@ blockquote { background: #637d7510; } +::selection { + background: #1d4125; /* WebKit/Blink Browsers */ +} + table { table-layout: fixed; width: 100%; diff --git a/Programming_Languages/Shell/Bash_snippets/Read_input_file_line_by_line.md b/Programming_Languages/Shell/Bash_snippets/Read_input_file_line_by_line.md deleted file mode 100644 index 16e585f..0000000 --- a/Programming_Languages/Shell/Bash_snippets/Read_input_file_line_by_line.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -categories: - - Programming Languages -tags: - - shell ---- - -# Read an input file line by line - -```bash -# Add snippet here -``` diff --git a/Programming_Languages/Shell/Lists_and_arrays.md b/Programming_Languages/Shell/Lists_and_arrays.md index 0b922e0..86cdefa 100644 --- a/Programming_Languages/Shell/Lists_and_arrays.md +++ b/Programming_Languages/Shell/Lists_and_arrays.md @@ -6,26 +6,7 @@ tags: - data-structures --- -# Lists and arrays in Bash - -## List variables - -When we use the term **list** in bash, we are not actually referring to a specific type of data structure. Instead a **list variable** is really just a normal variable wrapped in quote marks that has strings separated by spaces. Despite the fact that this is not an actual iterative data structure, we are still able to loop through variables of this type. - -```bash -A_STR_LIST="cat dog hamster" -AN_INT_LIST="1 2 3" -``` - -To iterate through a list variable, we can use a for loop: - -```bash -for ele in $A_STR_LIST; do - echo $ele -done -``` - -## Arrays +# Arrays in Bash We define an array as follows: @@ -39,17 +20,17 @@ We can also explicitly define an array using `declare` : declare -a words=("element1" "element2" "element3") ``` -### Index notation +## Index notation We access specific array elements by their index using the same braces style we use with variables: ```bash -echo ${words[2]} +echo "${words[2]}" # element3 ``` -### Iterating through arrays +## Iterating through arrays ```bash for i in "${words[@]}" @@ -62,9 +43,9 @@ done Note that `@` here is a special symbol standing for all the members of the `words` array. -### Sorting arrays +## Sorting arrays -#### Sorting an integer array highests to lowest +### Sorting an integer array highests to lowest ```bash sorted_array=($(echo "${array[@]}" | tr " " "\n" | sort -nr)) @@ -74,6 +55,20 @@ Where `array` is the name of the original array. The sorted array will be stored The `sort` command sorts the input in reverse numerical order (`-n` for numerical sort and `-r` for reverse sort). The `tr` command is used to convert the spaces in the array to newline characters so that each element is sorted on a separate line. +## Pushing, appending to an array + +We use the `+=` shorthand to add elements to a preexisting array: + +```bash +preExistingArray=(1 2 3) +preExistingArray+=(4) +echo preExistingArray +# 1 2 3 4 + +``` + +> Note that we have to put the item we want to addend within array brackets + ## Looping through file system The following script loops through all files in a directory that begin with `l` and which are of the bash file type (`.sh`) : @@ -94,3 +89,22 @@ declare -A rock=(["win"]="scissors" ["lose"]="paper") ``` We would then individuate a value with `"${rock[win]}"` + +## Lists as implicit string arrays + +When we use the term **list** in bash, we are not actually referring to a specific type of data structure. Instead a **list variable** is really just a normal variable wrapped in quote marks that has strings separated by spaces. Despite the fact that this is not an actual iterative data structure, we are still able to loop through variables of this type. + +```bash +A_STR_LIST="cat dog hamster" +AN_INT_LIST="1 2 3" +``` + +To iterate through a list variable, we can use a for loop: + +```bash +for ele in $A_STR_LIST; do + echo $ele +done +``` + +We are leveraging this aspect of Bash when we [loop through each character in a string](/Programming_Languages/Shell/Strings_in_bash.md#loop-through-each-character-in-a-string). diff --git a/Programming_Languages/Shell/Read.md b/Programming_Languages/Shell/Read.md index fe23a6c..3b74b89 100644 --- a/Programming_Languages/Shell/Read.md +++ b/Programming_Languages/Shell/Read.md @@ -5,7 +5,7 @@ tags: - shell --- -# `read` +# read The primary use of `read` is to capture user input from `stdin`. It is also often used frequently to parse strings or files that are redirected to it (with `<` and `<<`) or piped to it. In each case, what is read is stored as a variable. @@ -41,7 +41,7 @@ while read var; do done < './input-file.txt ``` -## `$REPLY` +## $REPLY If you do not assign a variable name to store the value that `read` reads a default (`$REPLY`) is applied. You can reference this value in your code. diff --git a/Programming_Languages/Shell/Split_into_array.md b/Programming_Languages/Shell/Split_into_array.md index 6c0ae0b..8239aec 100644 --- a/Programming_Languages/Shell/Split_into_array.md +++ b/Programming_Languages/Shell/Split_into_array.md @@ -7,7 +7,7 @@ tags: # Splitting input into an array -## `readarray` +## readarray `readarray` makes it really easy to split input into an array based on new lines. Say we have this file as input: @@ -48,7 +48,7 @@ is Add more: https://linuxhint.com/split-string-array-bash/ -## `read` +## read For different delimiters we have to use `read`, combined with `IFS` the **Internal Field Separator**. @@ -62,3 +62,40 @@ something, something else, something more ```bash IFS=',' read -a arr < ./comma_inputs.txt ``` + +> We use the `-a` flag to signal that we want each item read returned as an element in an array + +## mapfile + +We can use `mapfile` to read the lines of a input file in set segments. + +For the following file: + +``` +line one +line two +line three +line four +``` + +We could generate the following output: + +``` +-----SNIP----- +line one +line two +-----SNIP----- +line three +line four +``` + +With: + +```bash +while mapfile -t -n 2 ary && ((${#ary[@]})); do + printf '%s\n' "${ary[@]}" + printf -- '--- SNIP ---\n' + done < $testInput +``` + +So, while there are input lines, map each line into an array and return it in groups of 2. diff --git a/Programming_Languages/Shell/Test_values_in_Bash.md b/Programming_Languages/Shell/Test_values_in_Bash.md index ce6084b..d6817d5 100644 --- a/Programming_Languages/Shell/Test_values_in_Bash.md +++ b/Programming_Languages/Shell/Test_values_in_Bash.md @@ -71,3 +71,19 @@ The extended test supports the standard `test` comparisons and adds other featur ``` [[ -d ~ || -a /bin/mash ]]; echo $? ``` + +## Further examples + +**Test if a character exists in two strings** + +```bash +string1="hello" +string2="world" +char="l" + +if [[ "$string1" == *"$char"* ]] && [[ "$string2" == *"$char"* ]]; then + echo "Character '$char' exists in both strings." +else + echo "Character '$char' does not exist in both strings." +fi +```