【发布时间】:2013-11-03 17:27:01
【问题描述】:
我对 shell 脚本比较陌生,但对编程不熟悉,尽管我承认有一段时间不玩这个游戏了。
在试图找出 Bash 脚本中的错误的底部时,我提出了三个简短的示例,说明我使用进程替换和“这里的字符串”为while 循环提供 STDIN,以避免子shell问题。
我对@987654322@ 输出进行了空分隔,以避免与不寻常的文件名字符发生冲突。
这个例子效果很好,输出根目录下所有文件夹的名称:
#!/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