我可以在值中创建一个带有*
的bash变量,然后在使用时通过shell扩展*
吗?
E.g。
sourcefiles=/path/*.phtml*
filesfound=0
for f in $sourcefiles;
do
echo "Found file named: $f";
mv $f /other/path/"$f"
(($filesfound++))
done
这是作为cron作业的一部分运行的,我在电子邮件中收到错误消息:
mv: cannot stat `/path/*.phtml*': No such file or directory
所以在我看来,*
并没有扩大,也许只有在它找不到任何匹配时...
答案 0 :(得分:3)
正确:当没有匹配时,不扩展是默认行为!
这让
ls *.txt
返回类似于
的错误ls: no file '*.txt' found
而不是回退到列出所有文件的默认行为(如果没有参数的话)。
如果希望评估为空列表,请使用:
shopt -s nullglob
...或者只检查是否存在任何结果:
for f in $sourcefiles; do
[[ -e $f ]] || continue
echo "Found file named: $f";
mv "$f" /other/path/"$f"
((++filesfound))
done
或者,请考虑:
shopt -s nullglob
sourcefiles=( /path/*.phtml* )
filesfound=${#sourcefiles[@]}
# print entire list, with names quoted to make hidden characters &c readable
printf 'Found file named: %q\n' "${sourcefiles[@]}"
# warning: this only works if the list is short enough to fit on one command line
mv -- "${sourcefiles[@]}" /other/path/