Shell 编程技巧:数组和逗号分隔的字符串之间的任意转换

# 测试(1)
SOURCE_TOPICS_LIST="source-topic-1,source-topic-2"

# iterate directly note: $(IFS..) is NOT a shell array, but iterable
for topic in $(IFS=','; echo $SOURCE_TOPICS_LIST); do
    echo $topic
done

# 测试(2)
SOURCE_TOPICS_LIST="source-topic-1,source-topic-2"

# convert to shell array - style 1
# 注意:以下做法能正常工作的前提是:当前session没有修改过IFS
# 这样,空格切分的字符串才能被解析为独立的数组元素! 
# 虽然上面的测试(1)修改过了IFS,但是在$(...)形式的sub-shell中
# 所以不会影响到当前session中的IFS
SOURCE_TOPICS=(${SOURCE_TOPICS_LIST//,/ })
# iterate as a shell array
for topic in "${SOURCE_TOPICS[@]}"; do
    echo $topic
done

# 测试(3)
SOURCE_TOPICS_LIST="source-topic-1,source-topic-2"

# convert to shell array - style 1
# 注意:IFS同样会作用于数组元素的切分上!
# 以下代码通常是可正常运行的,并不是因为Shell里认定的数组形式就是(元素1 元素2 ...)
# 而是因为默认的$IFS(Input Field Separator)里有空格符,所有数组中的各元素才被切分开
# 如果我们显式修改了IFS,就像下面这样,你会发现:原来的:(${SOURCE_TOPICS_LIST//,/ }) 
# 就不再正常工作了,反倒是下面的: (${SOURCE_TOPICS_LIST}) 是正确的了!
# 所以,实际上,Shell数组的标准形式应该是(元素1$IFS元素2$IFS...)
IFS=','; SOURCE_TOPICS=(${SOURCE_TOPICS_LIST})
# iterate as a shell array
for topic in "${SOURCE_TOPICS[@]}"; do
    echo $topic
done

# 测试(4)
SOURCE_TOPICS_LIST="source-topic-1,source-topic-2"

# convert to shell array - style 2
# 注意:only for read,IFS后面可以没有分号
# 还要特别留意的地方是:当前session下的IFS已经被改动了!
# 这可能会影响到其他脚本的执行!
IFS=',' read -r -a SOURCE_TOPICS <<< "${SOURCE_TOPICS_LIST}"

# iterate as a shell array
for topic in "${SOURCE_TOPICS[@]}"; do
    echo $topic
done

# 补充:最后重置一下IFS!改为默认值: a space, a tab, and a newlin
IFS=$' \t\n'
# 查看
cat -etv <<< "$IFS"

猜你喜欢

转载自blog.csdn.net/bluishglc/article/details/132581573
今日推荐