On Sun, 17 Mar 2024, Greg Wooledge wrote:
On Sun, Mar 17, 2024 at 09:25:10AM +0000, Tim Woodall wrote:In almost all other cases, the space separated items cannot, even in theory, contain a rogue space, so suppressing the warning is fineFamous Last Words™.
As one example, it calls out to an external program that builds a cache in a temporary dir and it can be told to keep that temporary dir for future runs. $ cat test #!/bin/bash do_work() { local f=0 while [[ $1 =~ ^-- ]]; do [[ $1 = "--fast" ]] && f=1 shift done echo -n "first file arg = '$1'" [[ ${f} -eq 1 ]] && echo -n " running with --fast" echo } loopitems=( aitem1 aitem2 bitem1 bitem2 ) declare -A fast echo "No quoting" for i in "${loopitems[@]}"; do do_work ${fast[${i:0:1}]} --option1 --option2 "${i}" fast[${i:0:1}]=--fast done echo echo "Quoting" unset fast declare -A fast for i in "${loopitems[@]}"; do do_work "${fast[${i:0:1}]}" --option1 --option2 "${i}" fast[${i:0:1}]=--fast done $ shellcheck test In test line 26: do_work ${fast[${i:0:1}]} --option1 --option2 "${i}" ^---------------^ SC2086: Double quote to prevent globbing and word splitting. Did you mean: do_work "${fast[${i:0:1}]}" --option1 --option2 "${i}" $ ./test No quoting first file arg = 'aitem1' first file arg = 'aitem2' running with --fast first file arg = 'bitem1' first file arg = 'bitem2' running with --fast Quoting first file arg = '' first file arg = 'aitem2' running with --fast first file arg = '' first file arg = 'bitem2' running with --fast because fast is an array I can't use the trick that "${x[@]}" expands to nothing at all when fast is a list because you cannot have an array of lists. I could, instead, use something like (I haven't tested these exactly lines so tweaks are possibly needed) declare -a "fast_${i:0:1}=( --fast )" and declare -n "v=fast_${i:0:1}" do_work "${v[@]}" ... Which is what I've now done in the one place where filenames were involved.