【问题标题】:Here Strings: What is going on here?这里的字符串:这里发生了什么?
【发布时间】:2013-11-03 17:27:01
【问题描述】:

我对 shell 脚本比较陌生,但对编程不熟悉,尽管我承认有一段时间不玩这个游戏了。

在试图找出 Bash 脚本中的错误的底部时,我提出了三个简短的示例,说明我使用进程替换和“这里的字符串”为while 循环提供 STDIN,以避免子shell问题。

我对@9​​87654322@ 输出进行了空分隔,以避免与不寻常的文件名字符发生冲突。

这个例子效果很好,输出根目录下所有文件夹的名称:

#!/bin/bash
while IFS= read -r -d '' y; do echo "${y}"
done < <(find / -type d -maxdepth 1 -mindepth 1 -printf "%P\0" | sort -z)

这个例子也效果很好

#!/bin/bash
find / -type d -maxdepth 1 -mindepth 1 -printf "%P\0" | sort -z | \
{ while IFS= read -r -d '' y; do echo "${y}"; done }

但是在这种情况下,我将find 输出存储在字符串x 中并尝试将其用作我的“此处字符串”的来源,什么都不输出

#!/bin/bash
x=$(find / -type d -maxdepth 1 -mindepth 1 -printf "%P\0" | sort -z)
while IFS= read -r -d '' y; do echo "${y}"; done <<< "${x}"

我在这里缺少什么微妙之处(或我的密集度)?

我正在使用 GNU bash 4.1.7(2)-release。

【问题讨论】:

  • 使用更多报价! x="$(...)"
  • @sputnick 在这样的变量赋值中没有必要。
  • @sputnick,我尝试了你的建议,但没有发现任何区别。
  • bash 可能不喜欢变量内部的\0
  • @sputnick 学习语言而不是输入无用的代码是个好习惯。

标签: bash shell while-loop heredoc process-substitution


【解决方案1】:

bash 中的字符串类似于 C 字符串,并且是 null 终止。这应该可以解释为什么当您尝试将输出分配给变量时它不起作用。

作为一个实验,你可以试试

a=$'foo\0bar'
echo "$a"

【讨论】:

  • 哦。嗯,这很有意义!谢谢。虽然我的第三个示例不应该只输出第一个文件夹名称,而不是什么?
  • 那就在zsh中试试吧。
  • @WumpusQ.Wumbley,如果我用于该项目的精简 Slackware 环境安装了 zsh,我会尝试一下。 zsh 是否允许在字符串变量中使用空值?
  • @briguy328 是的,确实如此。还有很多其他的便利,我强烈推荐学习它。
【解决方案2】:

当您将字符串分配给参数时,字符串的结尾会以第一个空字符终止。但是,shell 可以通过标准输入传递包含空字符的字符串,该输入可以读取任意字节流。

【讨论】:

  • devnull 打败了你,但非常感谢。如果我的代码只输出了一个文件夹名称,而不是零个文件夹名称,我想我可能会遇到这种情况。事实上,我仍然不明白为什么它不这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 2017-11-14
  • 1970-01-01
相关资源
最近更新 更多