gpt4 book ai didi

linux - 将数组转换为字符串时无法使 IFS 工作

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:52 27 4
gpt4 key购买 nike

下面是一个 bash shell 脚本,用于接收 csv 文件并按我想要的方式输出行(还有一些更改,但我只保留影响下面的数组以显示)。

FILENAME=$1
cat $FILENAME | while read LINE
do
OIFS=$IFS;
IFS=","
columns=( $LINE )
date=${columns[4]//\"/}
columns[13]=${columns[13]//\"/}
columns[4]=$(date -d $date +%s)
newline=${columns[*]}
echo $newline
IFS=$OIFS;
done

我正在使用 GNU bash v 4.1.2(1)-release for CentOS 6.3。我试过像

这样的引号
newline="${columns[*]}"

仍然没有运气。

以下是示例数据行

112110120001299169,112110119001295978,11,"121.119.163.146.1322221980963094","2012/11/01"

它似乎应该将数组输出为逗号分隔的字符串。相反,该字符串是用空格分隔的。有谁知道原因吗?

我怀疑这与以下事实有关:如果我在脚本中回显 $IFS,它是一个空字符串,但当我回显“${IFS}”时,它就是我期望的逗号。

编辑:解决方案

我找到了解决方案。当回显 $newline 时,我必须在它周围使用引号,即

echo "$newline"

否则,它使用默认空白。我相信这与 bash 有关,只有当您用引号强制它时才替换 IFS。

最佳答案

我不清楚为什么,但 bash 似乎只使用 IFS 的第一个字符作为双引号中扩展 ${array[*]} 时的分隔符:

$ columns=(a b "c d e" f)
$ IFS=,
$ echo ${columns[*]}
a b c d e f
$ echo "${columns[*]}"
a,b,c d e,f
$ newline=${columns[*]}; echo "$newline"
a b c d e f
$ newline="${columns[*]}"; echo "$newline"
a,b,c d e,f

幸运的是,解决方案很简单:使用双引号 (newline="${columns[*]}")

(顺便说一句,我的测试都是在 bash v3 和 v2 上进行的,因为我手边没有 v4;所以它可能对你有所不同。)(更新:在 bash v4.2.10 上测试,结果相同。)

关于linux - 将数组转换为字符串时无法使 IFS 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13999446/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com