来自bash循环的无法解释的字符串

时间:2014-10-16 20:20:12

标签: bash

我有一些名为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 **文件,则没有问题。那为什么呢?

2 个答案:

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

这将列出所有文件,不需要循环。