我对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。
答案 0 :(得分:2)
bash中的字符串类似于C字符串,并且以null结尾。这可以解释为什么当您尝试将输出分配给变量时它不起作用。
作为实验,您可以尝试
a=$'foo\0bar'
echo "$a"
答案 1 :(得分:1)
将字符串分配给参数时,字符串的结尾将由第一个空字符终止。但是,shell可以通过标准输入传递包含空字符的字符串,该输入可以读取任意字节流。