Bash Arrays =========== Literal arrays ^^^^^^^^^^^^^^ .. code-block:: bash # literal array of four strings arx=( a b c d ) # print the whole array, we can't just do $arx, because this is an Array! echo ${arx[@]} # Indexing an Array echo ${arx[1]} # b # get the length of the array len=${#arx[@]} # this also works, but will not quote internal array strings that might have the splitter len2=${#arx[*]} # last index of the array last_element=$(( len - 1 )) # Grab the last element of the array echo ${arx[$(( len - 1 ))]} # echo d # or echo ${arx[(( len - 1 ))]} # omit the internal $ # or echo ${arx[$(( ${#arx[@]} - 1 ))]} # or even echo ${arx[(( {#arx[@]} - 1 ))]} dynamically created Arrays ^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: bash IFS=":"; path_tokens=( $PATH ); unset IFS # or path_tokens=( $(echo $PATH | tr ":" " ") ) echo "PATH has ${#path_tokens[@]} tokens" echo "$PATH" len=${#path_tokens[@]} echo "last path is ${path_tokens[(( len - 1 ))]}" # or echo "last path is ${path_tokens[(( $len - 1 ))]}" # or echo "last path is ${path_tokens[(( ${#path_tokens[@]} - 1 ))]}" Slicing Arrays ^^^^^^^^^^^^^^ https://stackoverflow.com/a/1336245/11003729 .. code-block:: bash A=( foo bar "a b c" 42 ) B=("${A[@]:1:2}") # :1:2 takes a slice of length 2, starting at index 1. C=("${A[@]:1}") # slice to the end of the array echo "${B[@]}" # bar a b c echo "${B[1]}" # a b c echo "${C[@]}" # bar a b c 42 echo "${C[@]: -2:2}" # a b c 42 # The space before the - is necessary associative arrays ^^^^^^^^^^^^^^^^^^ .. code-block:: bash declare -A fruits fruits["a"]="apples" fruits["b"]="berries" fruits["c"]="cherries" echo "${fruits['a']}" # apples # count of mappings echo "${#fruits[@]}" # 3 # expands the values echo "${fruits[@]}" # apples berries cherries # expand the keys echo "${!fruits[@]}"