【问题标题】:bash “read -a” looping on null delimited string variablebash“read -a”在空分隔的字符串变量上循环
【发布时间】:2016-04-05 22:45:26
【问题描述】:

我一直在阅读这篇文章:bash "for in" looping on null delimited string variable 看看我是否能够处理数组中包含空格的任意文本。

根据上面的帖子,这工作正常:

while IFS= read -r -d '' myvar; do echo $myvar; done < <(find . -type f -print0)

为了检查我的理解,我也这样做了(仍然可以正常工作):

while IFS= read -r -d '' myvar; do echo $myvar; done < <(printf "%s\0" 'a b' 'c d')

但是,然后我尝试将输出存储在一个数组中,它出错了:

IFS= read -r -d '' -a myvar < <(printf "%s\0" 'a b' 'c d')

该数组仅包含 a b 而不是 c d

echo ${myvar[@]}
a b

显然,我在这里遗漏了一个更精细的细节。感谢您的帮助。

PS。我在跑步:

GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin14)
Copyright (C) 2007 Free Software Foundation, Inc.

【问题讨论】:

  • 来自help read从标准输入中读取一行并将其拆分为字段。 'ab\0c d` 不止一行。
  • read -a 用于将单行上的单词分配到数组中。要将空分隔的行读入数组:unset arr i; while IFS= read -r -d '' 'arr[i++]'; do :; done &lt; &lt;(printf "%s\0" 'a b' 'c d').
  • 根据定义,一行由 ascii 0 终止,对吧?例如,换行符只是一个格式化字符?
  • 这个用例让我想知道为什么readarray 命令不允许您指定备用行终止符。
  • 我已经实施了@4ae1e1 的建议并且效果很好。紧凑的语法read 'arr[i++]'; do :; done 对我来说是新的。谢谢。我的副作用是我还了解了以下之间的区别:

标签: arrays bash delimiter null-character


【解决方案1】:

bash 4.4 中,readarray 命令获得了一个-d 选项,类似于read 的相同选项。

$ IFS= readarray -d '' myvar < <(printf "%s\0" 'a b' 'c d')
$ printf "%s\n" "${myvar[@]}"
a b
c d

如果您必须支持早期版本,则需要显式循环输出。

while IFS= read -d '' line; do
    myvar+=( "$line" )
done < <(printf "%s\0" 'a b' 'c d')

【讨论】:

  • 很高兴知道readarray 终于得到-d。这确实是一个很自然的选择。
  • myvar+=( "$line" ) 在空格字符上分割
  • @ToreH-W 不引用 $line 时。
  • 我刚刚从这个答案中学到了另一个巧妙的技巧,那就是 printf 命令会自动循环,只要还有未使用的参数剩余(如果没有足够的填充,则将空字符串作为参数模板)。
猜你喜欢
  • 2012-01-30
  • 2012-12-24
  • 2021-10-26
  • 2012-04-19
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多