From 003d3df9f648cd9e5929d1e926b3246bc5bf050d Mon Sep 17 00:00:00 2001 From: Egor Tensin Date: Mon, 30 Sep 2019 05:27:26 +0300 Subject: export bash.md to egor-tensin/blog.git --- bash.md | 66 ----------------------------------------------------------------- 1 file changed, 66 deletions(-) delete mode 100644 bash.md diff --git a/bash.md b/bash.md deleted file mode 100644 index 4856716..0000000 --- a/bash.md +++ /dev/null @@ -1,66 +0,0 @@ -GNU `bash` -========== - -(Associative) arrays --------------------- - -### Declaration - -`"${#xs[@]}"` doesn't work with `nounset` if `xs` wasn't defined, i.e. was -declared with either of - - local -a xs - declare -a xs - local -A xs - declare -A xs - -Therefore, if you want to extract the length of an array, append `=()` to the -statements above. - - local -a xs=() - declare -a xs=() - ... - -And now `"${#xs[@]}"` works with `nounset`. -It doesn't affect expansion (see below) though. - -### Expansion - -#### Do - - func ${arr[@]+"${arr[@]}"} - -#### Don't - - func "${arr[@]}" # Doesn't work with `nounset`. - func "${arr[@]+"${arr[@]}"}" # Doesn't work properly with `declare -a arr=('')`. - -### `unset` - -#### Do - - unset -v 'arr[x]' - unset -v 'arr[$i]' - -#### Don't - - unset -v arr[x] # May break due to globbing. - unset -v arr[$i] # The same as above + a possible problem with quotation. - unset -v 'arr["x"]' # Doesn't work for some reason. - unset -v 'arr["]"]' # The same as above; just highlighting the problem with funny characters in array indices. - unset -v 'arr["$i"]' # Also rejected. - - # An insightful discussion on the topic: https://lists.gnu.org/archive/html/help-bash/2016-09/msg00020.html. - -`errexit` ---------- - -### Do - - bar_output="$( bar )" - foo "$bar_output" - -### Don't - - foo "$( bar )" # With `errexit`, foo will still get executed. - # I don't know why. -- cgit v1.2.3