【问题标题】:Bash string to array with IFS使用 IFS 将字符串转换为数组
【发布时间】:2012-07-10 05:39:28
【问题描述】:

我在使用 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

但是,当我删除 IFS 行时,它可以工作。但是我用了几行来打印出它的默认 ASCII 值,我得到了 '32' 这意味着 'Space' 字符。作为一名强迫症程序员,为了安全起见,我想自己设置它......我不知道它是如何预先预设的!

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

【问题讨论】:

  • 您的代码在 bash v3.2.25 上运行,您使用的是什么语言环境?
  • 不确定,如何才能知道?
  • 适用于我的 GNU bash 版本 4.2.29。尝试将空格放在“ ”之类的地方,看看是否有什么不同。
  • 几分钟前刚刚回答了类似的问题:stackoverflow.com/a/11416230/1327576
  • @YoungMoney,它与预期行为有何不同?它对我有用:string="a b c d e"; tokens=(${string}); echo "Third token: ${tokens[2]}" 打印出Third token: c,正如我所料。

标签: arrays string bash scripting


【解决方案1】:

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

试试这个:

echo "$IFS" | cat -vte

如果你没有更改$IFS,输出应该是:

 ^I$
$

这是一个空格,后跟一个制表符:^I,和一个换行符 - 请注意,cat 将任何换行符打印为$

所以你的脚本摘录应该可以在不接触$IFS的情况下工作。

【讨论】:

  • 好吧,但我不明白为什么我自己尝试将其设置为 Space 不起作用。不过很高兴知道默认值是什么。
  • cat -te 等同于cat -vTE,因此您可以跳过-v
【解决方案2】:

它确实有效,但无论如何都没有必要,因为默认情况下保证空间在 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

规范的方法是:

read -ra arr <<<"$str"

如果 IFS 不是空格,则可以在 read 的环境中选择设置 IFS 以充当分隔符。

【讨论】:

    【解决方案3】:

    我建议不要单独使用$IFS 将单词拆分成一个数组,因为设置和恢复 $IFS 很痛苦。使用这样的东西:

    DATES_STRING='Jun01 Jun02 Jun03 Jun04 Jun05'
    
    IFS=' ' read -a DATES_ARRAY <<< "$DATES_STRING"
    

    我还建议在read 的环境中明确设置$IFS,这样您就可以确定它是什么。

    【讨论】:

    • 这不会改变 IFS 吗?
    猜你喜欢
    • 1970-01-01
    • 2016-03-23
    • 2017-11-27
    • 2011-06-18
    • 2014-04-03
    • 1970-01-01
    相关资源
    最近更新 更多