Ubuntu 16.04
#!/bin/bash
site="hello"
wDir="/home/websites/${site}/httpdocs/"
for file in $(find "${wDir}" -name "*.css")
do
echo "$file";
done
exit 0;
即使我定义了开始目录,shellcheck 也会警告我,但脚本工作得很好。
root@me /scripts/ # shellcheck test.sh
In test.sh line 6:
for file in $(find "${wDir}" -name "*.css")
^-- SC2044: For loops over find output are fragile. Use find -exec or a while read loop.
问题正是 shellcheck 告诉你的:
for
迭代find
或类似命令的输出的循环是脆弱的。例如:安全的方法是使用
-exec
offind
:或者使用
while
循环:使用
for
循环find
输出充其量是一种反模式。请参阅BashFAQ/001 - 如何逐行(和/或逐字段)读取文件(数据流、变量)?为什么。使用while
下面的循环和read
命令。以下命令find
用 NULL 字节分隔输出,并read
通过拆分该字节来读取命令,以便安全处理名称中包含特殊字符的所有文件(包括换行符)或者完全避免使用管道并进行流程替换
Web ShellCheck不会报告上述两个片段中的任何一个的任何问题。