使用IFS将字符串Bash转换为数组

时间:2012-07-10 17:17:40

标签: arrays string bash scripting

我在使用IFS将字符串转换为数组时遇到问题。这就是我的字符串:

"Jun01 Jun02 Jun03 Jun04 Jun05 ..." #in that format, separated by spaces

以下是我尝试过的代码:

IFS=" " #set it to space character
DATES_ARRAY=($DATES_STRING) #from above
echo ${DATES_ARRAY[0]} #output is empty

然而,当我删除I​​FS线时,它可以工作。但我使用几行打印出其默认的ASCII值,我得到'32',这意味着'空格'字符。作为一名OCD程序员,我想把它自己设置为安全......我不知道它是如何预先设定的!

那么为什么尝试手动将IFS设置为Space不起作用?

3 个答案:

答案 0 :(得分:7)

它确实有效,但无论如何都是不必要的,因为默认情况下保证空间在IFS中。不要手动设置。这样做可能会导致问题。

基本上,永远不要在Bash中使用分词。如果使用得非常小心,有时需要咬住子弹并使用它限制在POSIX sh。如果您要设置IFS,请将其设置在少数具有一定效果的命令之一的环境中,或者最多设置在本地功能中。

你永远不需要使用它,所以我不会解释所有内容:

$ printf -v str '%s ' Jun{01..10}
$ set -f
$ IFS=' ' declare -a 'arr=($str)'
$ declare -p arr
declare -a arr='([0]="Jun01" [1]="Jun02" [2]="Jun03" [3]="Jun04" [4]="Jun05" [5]="Jun06" [6]="Jun07" [7]="Jun08" [8]="Jun09" [9]="Jun10")'

IFS在这里冗余地设置空间以显示它有效。

从字符串到数组的最正确方法可能是使用read。许多例子here

cannonical方法是:

read -ra arr <<<"$str"

其中IFS可选地在read的环境中设置,如果它不是空格,则作为分隔符。

答案 1 :(得分:4)

我建议不要单独使用$IFS来分词到数组,因为设置和恢复$ IFS是一件痛苦的事。使用这样的东西:

DATES_STRING='Jun01 Jun02 Jun03 Jun04 Jun05'

IFS=' ' read -a DATES_ARRAY <<< "$DATES_STRING"

我还建议在$IFS的环境中明确设置read,以便您完全确定它是什么。

答案 2 :(得分:1)

默认$IFS是使用空格作为标记分隔符,包括标签和换行符。

试试这个:

echo "$IFS" | cat -vte

如果您未更改$IFS,则输出应为:

 ^I$
$

这是一个空格,后跟一个标签:^I和换行符 - 请注意cat正在打印任何换行符$

因此,您的脚本摘录应该无需触及$IFS