Skip to content

Files

Latest commit

 

History

History
56 lines (35 loc) · 1.47 KB

SC2207.md

File metadata and controls

56 lines (35 loc) · 1.47 KB

Pattern: Unquoted command expansion in array

Issue: -

Description

You are doing unquoted command expansion in an array. This will invoke the shell's word splitting and glob expansion.

Instead, prefer explicitly splitting (or not splitting):

  • If the command output should become a single array element, quote it.
  • If you want to split the output into lines or words, use mapfile, read -ra and/or while loops as appropriate.

This prevents the shell from doing unwanted splitting and glob expansion, and therefore avoiding problems with output containing spaces or special characters.

Example of incorrect code:

array=( $(somecommand) )

Example of correct code:

If the output should be a single element:

array=( "$(somecommand)" )

If it outputs multiple lines, each of which should be an element:

# For bash
mapfile -t array < <(somecommand)

# For ksh
somecommand | while IFS="" read -r line; do array+=("$line"); done

If it outputs a line with multiple words (separated by spaces, other delimiters can be chosen with IFS), each of which should be an element:

# For bash
IFS=" " read -r -a array <<< "$(somecommand)"

# For ksh
IFS=" " read -r -A array <<< "$(somecommand)"

Exceptions

If you have already taken care (through setting IFS and set -f) to have word splitting work the way you intend, you can ignore this warning.

Further Reading