在逗号分隔的子字符串上循环,同时不中断空格



我有一个类似逗号分隔值的变量,需要循环,我使用的是下面的代码

Var=test_v1,"Log Processor",test_v2
for i in ${Var//,/ }
do
echo "Variables are  "${i}" assined"
done

输出:

Variables are test_v1 assined
Variables are Log assined
Variables are Processor assined

它并没有把带有双引号的整个单词作为单个单词,它给我的输出就像Log和Processor一样不同,只是它的单个值。

(最好(使用read -a读取数组:

#!/usr/bin/env bash
#              ^^^^ arrays are a bash feature, not guaranteed in /bin/sh
Var=test_v1,"Log Processor",test_v2
IFS=, read -a Array <<<"$Var"          # this updates IFS only for the duration of 'read'
for i in "${Array[@]}"; do             # now loop over elements in the array read created
echo "Variables are ${i} assined"
done

或者(更糟的是(将IFS更改为只包含您想用于拆分字段和禁用全局分隔的字符,这样您就可以安全地使用未引用的扩展:

Var=test_v1,"Log Processor",test_v2
IFS=,              # set the comma as the only field separator
set -f             # disable globbing
for i in $Var; do  # perform an unquoted expansion to split on IFS
echo "Variables are ${i} assined"
done
# WARNING: This code left globbing disabled and ',' as the only field separator!

由于${Var//,/ }将逗号更改为空格,因此所有空格和逗号都无法区分,因此您可以在两者上进行拆分。不要那样做;相反,读取一个数组并对其内容进行迭代。

最新更新