1

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

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

我对find输出进行空分隔以避免与不寻常的文件名字符相关的潜在问题。

此示例效果很好,并输出根目录下所有文件夹的名称:

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

4

2 回答 2

1

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

于 2013-10-24T20:17:14.220 回答
1

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

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

a=$'foo\0bar'
echo "$a"
于 2013-10-24T20:18:13.720 回答