这是一个作业问题,所以我不直接寻找答案或脚本。因此,在我的一个问题中,我被要求删除包含以下内容的文件:任何传递的命令行参数。这是脚本片段
#!/bin/sh
#some more stuff here
for args in "$@"; do
if [ $# != 0 ]; then
grep -l $args * | while read theFile;
do
if [ -f "$theFile" ] ; then
rm "$theFile"
echo "$theFile is deleted with $args match"
else
echo "$theFile not deleted"
exit 2
fi
done #end of while loop
else
echo "No match found with $args"
exit 1
fi
done
echo "DONE"
exit 0
现在,我想知道我将如何编写脚本,以便它删除具有全部论据?我知道我需要检查每个文件是否都有通过 for 循环传递的参数,但我不确定如何编写它。任何意见将不胜感激。
如果需要该信息,我正在使用 cloud9 进行练习。
答案1
现在,您将循环遍历关键字 ( for arg in..
),然后针对每个关键字检查哪些文件包含该关键字 ( grep -l $arg *
)。
要检查包含所有关键字的文件,您可以将其反转,然后循环遍历所有文件 ( for f in *
),然后循环遍历关键字 ( for arg in "$@"
),检查文件是否包含它们 ( grep -qe "$arg" "$f"
),仅在所有文件都匹配时才将其删除。
这有点暴力,因为你会执行grep
n*米次,对于n文件和米关键词。另一种方法是运行grep -l
第一个关键字,然后grep -l
运行第二个关键字,给出grep
最后一个 grep 返回的文件列表,等等。您可能希望在每一步中将文件列表保存在数组中。
附带说明一下,这没有任何意义:
for args in "$@"; do
if [ $# != 0 ];
您正在检查每个参数运行一次的循环内的数字参数。$#
当没有参数时恰好为零,但随后"$@"
也不包含任何内容,并且循环将不会运行。
这里:
grep -l $args * | while read theFile;
您可能应该引用$args
,并且您可能还想看看Bash常见问题解答 001有关使用while read
...的信息
简而言之,您可能想要
grep -l "$args" * | while IFS= read -r theFile; do