如何解决为什么 bash while 循环尝试处理不存在的 find 结果?
我有一个 bash 脚本,它使用 while 循环来获取从 find 命令返回的每个文件的基本名称。我在此处将其简化为一行:
$ while read myFile; do echo $(basename $myFile) ; done <<< $(find ./*test* -maxdepth 1 -type f -exec ls {} + 2>/dev/null)
testRelease.sh
在 find 命令没有结果的情况下,我希望 while 语句的条件未满足,并且“do”部分将被忽略。事实并非如此:
$ while read myFile; do echo $(basename $myFile) ; done <<< $(find ./*noMatch* -maxdepth 1 -type f -exec ls {} + 2>/dev/null)
basename: missing operand
Try `basename --help' for more information.
看起来好像 while 语句添加了一个条件试图处理的空行:
$ while read myFile; do echo $myFile ; done <<< $(find ./*noMatch* -maxdepth 1 -type f -exec ls {} + 2>/dev/null)
$
独立运行 find 命令时不会出现此空行。添加这个空行是什么意思,为什么while语句在没有找到结果的情况下会处理它?
解决方法
什么是添加这个空行
此处的字符串 <<<
正在添加一个尾随空行。如果你不想要它,你可以使用进程替换:
while read var; do ...; done < <(someCommand)
但是,在您的情况下,您根本不需要循环。 find -exec
可以更快、更安全地为您完成工作:
find ./*test* -maxdepth 1 -type f -exec basename {} \; 2>/dev/null
,
请让我将您的命令简化为:
while read line; do
echo "line read"
done <<< $(find . 1>/dev/null)
find 命令什么都不输出,那么上面的代码等价于:
while read line; do
echo "line read"
done <<< ""
它仍然打印“line read”。 bash
的联机帮助页说:
此处文档的一个变体,格式为:
[n]<<<word
[截断的行]
结果作为单个字符串提供,带有 换行符
附加,附加到命令的标准输入(或文件描述符 n,如果
n 被指定)。
然后 while
循环读取一个空行以执行 echo
。
如果将代码修改为:
while read line; do
echo "line read"
done < <(find . 1>/dev/null)
它不会输出任何东西。
,即使没有输出,您也至少将一个空字符串输入到循环中。您可以使用保证不产生输出的命令进行尝试。我在这个实验中使用了空命令 :
:
while read; do echo read=$REPLY; done <<<$(:)
产生一个输出行,说只是
读取=
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。