【问题标题】:Bash syntax help - mapfile/readarray (split text into array) [closed]Bash 语法帮助 - mapfile/readarray(将文本拆分为数组)[关闭]
【发布时间】:2020-09-02 14:09:10
【问题描述】:

在 bash 中,在一些 StackOverflow 答案中,它们展示了如何填充结果以将文件查找到数组中:

信息 1

旧的 bash 版本

mapfile -d $'\0' array < <(find . -name "${input}" -print0)

或更新的 bash 版本:(4.2+)

readarray -d '' array < <(find . -name "$input" -print0)

信息 2

然后还有这个把一个字符串拆分成一个数组但这对我不起作用。

readarray -d '|' PORTS <<< "${matched}"

我成功使用了这个,但这是旧语法

IFS='|' read -r -a PORTS <<< $matched

这些答案并没有解释完整的语法:

谁能解释一下:

信息 1

在普通( 括号之前的&lt; 括号是做什么的?如果我添加 space 和/或用 $ 替换它,则命令失败。但我想了解这是在做什么。

信息 2

我在某处找到了 readarray 的这种语法,但它对我不起作用,因此括号 &lt; 展示位置可能是同样的问题。如何正确使用?

【问题讨论】:

  • 对于 &lt;( ... ) 参见 process substitution,对于 readarray 参见 mapfile-t 可能有助于删除分隔符
  • 我知道$( ... ) 子进程,但我认为&lt; 可能只是一个替代字符。你有什么好的资源可以让我阅读更多吗?
  • 谢谢,您的更新评论与链接很清楚。我现在明白它的意思了,它还解释了你不能使用空格(就像我试过的那样),因为那样意义就不同了。
  • -d 是读取的选项,但不是 readarray aka mapfile。你需要使用类似IFS='|' readarray PORTS &lt;&lt;&lt; "$matched"的东西。

标签: bash syntax


【解决方案1】:

我没有收到我会赞成的答案。要回答 Info 1 的问题,以防 Nahuel 提供的链接过期,相关部分。这对我很重要,因为有时我想了解给定解决方案的作用,而有时答案中没有解释该部分。

它被称为流程替换

流程替换

进程替换允许使用文件名来引用进程的输入或输出。它的形式是

<(list)

>(list)

功能

进程列表异步运行,其输入或输出显示为文件名。作为扩展的结果,此文件名作为参数传递给当前命令。

  • 如果使用 &gt;(list) 表单,写入文件将为 list 提供输入。
  • 如果使用&lt;(list) 形式,则应读取作为参数传递的文件以获得list的输出。

关于我关于空格的问题

请注意,&lt;&gt; 和左括号之间不能出现空格,否则该构造将被解释为重定向。支持命名管道 (FIFO) 或命名打开文件的 /dev/fd 方法的系统支持进程替换。

如果可用,进程替换与参数和变量扩展、命令替换和算术扩展同时执行。

不过,我仍然需要澄清 Info 2

【讨论】:

    猜你喜欢
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2014-12-22
    • 2012-06-06
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    相关资源
    最近更新 更多