我有一个正在尝试读取的文本文件。假设 foo.txt 包含:
foo.org
foo.com
foo.net
foo
bar.org
bar.com
bar
blah.org
example.org
我需要读取这个文件并 grep 进行文件名的模式匹配(不是文件中的内容)
所有文件名都类似于:
foo.org.db foo.com.db bar.org.db
(它们末尾都有 .db,因为它们是区域文件)。
我一直在尝试类似的事情:
#!/bin/bash
FILE=foo.txt
DIR=/path/to/zone/files
MATCH=match.txt
NO_MATCH=nomatch.txt
read -r line; do
for a in $DIR
do
if [ line =~ $a ]
then
echo "$line" >> "$MATCH"
else
echo "$line" >> "$NO_MATCH"
done
done< $FILE
运行此脚本时,我看到创建了 $MATCH 但从未看到 $NO_MATCH。而且条件似乎不起作用。我真的需要将任何不匹配的内容写入文本文件。例如,如果 example.org 写入 $FILE 变量,但没有文件名匹配(没有 example.org.db),则 example.org 应写入 $NO_MATCH。我究竟做错了什么?
答案1
不需要内部循环,并且缺少while
:
while read -r name; do
files=$( echo "$DIR/$name"* )
if [[ "$files" != "$DIR/$name"* ]]; then
echo "$name" >>"$MATCH"
else
echo "$name" >>"$NO_MATCH"
fi
done <"$FILE"
echo "$DIR/$name"*
将扩展到与给定模式匹配的所有文件名。如果没有与该模式匹配的文件名,则该模式将保持未展开状态。