From 10e1694d5009b4fa34601122d77f930a320828cd Mon Sep 17 00:00:00 2001 From: Vidar Holen Date: Wed, 22 Apr 2020 19:04:54 -0700 Subject: [PATCH] Updated SC2046 (markdown) --- SC2046.md | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/SC2046.md b/SC2046.md index 65e366d..be625f0 100644 --- a/SC2046.md +++ b/SC2046.md @@ -27,24 +27,15 @@ If the command substitution outputs multiple pieces of data, use a loop instead. In rare cases you actually want word splitting, such as in + # shellcheck disable=SC2046 gcc $(pkg-config --libs openssl) client.c -This is because `pkg-config` outputs `-lssl -lcrypto`, which you want to break up by spaces into `-lssl` and `-lcrypto`. An alternative is to put the variables to an array and expand it: +This is because `pkg-config` outputs `-lssl -lcrypto`, which you want to break up by spaces into `-lssl` and `-lcrypto`. - # For bash - mapfile -t args < <(pkg-config --libs openssl) - - # For ksh - pkg-config --libs openssl | while IFS="" read -r line; do array+=("$line"); done +A bash alternative in these cases is to use `read -a` for words or `mapfile` for lines. ksh can also use `read -a`, or a `while read` loop for lines. In this case, since `pkg-config` outputs words, you could use: + + # Read words into an array in bash and ksh + read -ra args < <(pkg-config --libs openssl) # expand args - gcc "${args[@]}" client.c - -The power of using an array becomes evident when you want to combine, for example, the command result with user-provided arguments: - - compile () { - args=( "$(pkg-config --libs openssl)" "${@}" ) - gcc "${args[@]}" client.c - } - compile -DDEBUG - + gcc -lssl -lcrypto -DDEBUG client.c \ No newline at end of file + gcc "${args[@]}" client.c \ No newline at end of file