我有一个类似逗号分隔值的变量,需要循环,我使用的是下面的代码
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//,/ }
将逗号更改为空格,因此所有空格和逗号都无法区分,因此您可以在两者上进行拆分。不要那样做;相反,读取一个数组并对其内容进行迭代。