在bash中扩展变量值内的`*`

时间:2016-02-06 00:32:57

标签: bash

我可以在值中创建一个带有*的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

所以在我看来,*并没有扩大,也许只有在它找不到任何匹配时...

1 个答案:

答案 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/