我有一些名为OBS_SURFACE1 **,OBS_SURFACE101,OBS_SURFACE103的文件。是的,确实有一个名为OBS_SURFACE1 **的文件,我想问题出现在哪里。我写了一个bash脚本,其中包含:
for fil in ` ls OBS_DOMAIN1?? `
do
echo "appending" $fil
done
fil的第一个值是OBS_SURFACE1 ** OBS_SURFACE101 OBS_SURFACE103,第二个OBS_SURFACE101。虽然我希望第一个是OBS_SURFACE1 **。如果没有OBS_SURFACE1 **文件,则没有问题。那为什么呢?
答案 0 :(得分:3)
Don't parse ls
!它只会导致问题。请改用glob:
for fil in OBS_DOMAIN1??
do
echo "appending $fil"
done
您遇到的问题源于ls
的输出包含*
这一事实,正在通过bash进行扩展。请注意,我还引用了整个字符串echo
ed,这可以防止循环中的单词拆分。有关详细信息,请参阅上面评论中提供的链接。
正如指出in the comments(感谢Charles),您可能还希望在循环之前启用nullglob
,如下所示:shopt -s nullglob
。这意味着如果没有与模式匹配的文件,则循环将根本不运行,而不是使用$fil
运行文字值OBS_DOMAIN1??
。另一种选择是检查文件是否存在于循环内,例如使用:
if [[ -e "$fil" ]]; then
echo "appending $fil"
fi
或更紧凑的[[ -e "$fil" ]] && echo "appending $fil"
。
答案 1 :(得分:0)
另一种方法:
echo appending OBS_DOMAIN1??
这将列出所有文件,不需要循环。