在一个bash脚本中,我有一个变量包含一个shell glob表达式,我希望将其扩展为匹配的文件名数组(
nullglob
已打开),就像这样:pat='dir/*.config'
files=($pat)
即使在$pat
中有多个模式(例如pat="dir/*.config dir/*.conf
"),这个方法也可以很好地工作,但是我不能在模式中使用转义字符。理想情况下,我希望能够执行以下操作:
pat='"dir/*" dir/*.config "dir/file with spaces"'
要包括文件*
,所有以.config
结尾的文件和带有空格的文件
。是否有简单的方法可以做到这一点?(如果可能的话,不要使用eval
。)由于模式是从文件中读取的,因此我不能直接将其放置在数组表达式中,如此答案(以及其他各处)所建议的那样。
编辑:
为了让事情更清楚:我正在尝试逐行读取模板文件并处理所有类似于#include pattern
的行。然后,使用shell glob解析这些包含文件。由于此工具旨在通用,因此我希望能够包括带有空格和奇怪字符(例如*
)的文件。
"主"循环如下:
template_include_pat='^#include (.*)$'
while IFS='' read -r line || [[ -n "$line" ]]; do
if printf '%s' "$line" | grep -qE "$template_include_pat"; then
glob=$(printf '%s' "$line" | sed -nrE "s/$template_include_pat/\\1/p")
cwd=$(pwd -P)
cd "$targetdir"
files=($glob)
for f in "${files[@]}"; do
printf "\n\n%s\n" "# FILE $f" >> "$tempfile"
cat "$f" >> "$tempfile" ||
die "Cannot read '$f'."
done
cd "$cwd"
else
echo "$line" >> "$tempfile"
fi
done < "$template"
$(echo GOTCHA >&2)
这样的东西,我肯定不想执行$(...)
中的内容。 - steinyeval
的等价物。 - anishsane