字符串:这里发生了什么?

时间:2013-10-24 20:03:59

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

我对shell脚本编写起来相对较新,但不是编程,但我会承认暂时离开游戏。

在试图找到Bash脚本中的bug的底部时,我想出了三个简短的例子,说明我使用进程替换和“here strings”为while循环提供STDIN,以便避免子shell问题。

我将find输出置零,以避免使用不常见的文件名字符进行潜在的挣扎。

此示例效果很好,并输出root中所有文件夹的名称:

#!/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中,并尝试将其用作“此处字符串”的来源,不输出任何内容:< / p>

#!/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。

2 个答案:

答案 0 :(得分:2)

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

作为实验,您可以尝试

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

答案 1 :(得分:1)

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