我是 bash 初学者,我想解决下一个问题:查找作为命令行参数接收的目录中包含大于 1000 的数字的所有文件。如果命令行不包含任何参数,则显示一条消息并退出。
首先,我只想检查是否有一个数字等于 1000,因为我不知道如何使用 grep 检查它是否更大。这是我的代码:
#!/bin/bash
if [ $0 -eq 0 ]
then
echo "No arguments"
exit 0
fi
for filename in $1
do
if [ -f filename ]
then
if grep -q "1000" $filename
echo $filename
fi
fi
done
它在第 3 行和第 15 行引发了一些错误,我不知道为什么。
有人可以帮我吗?
更新的代码:
#!/bin/bash
if [ $1 -eq 0 ]
then
echo "No arguments"
exit 0
fi
for filename in $1
do
if [ -f filename ]
then
if grep -q "1000" $filename
then
echo $filename
fi
fi
done
答案1
$0
扩展为脚本的名称,而不是命令行参数。
如果您想检查是否没有命令行参数,可以使用:
if (($#==0)); then
echo "No arguments" >&2
exit 1
fi
$#
将扩展到命令行参数的数量。另请注意,我们将错误重定向到 stderr 并以代码 1 而不是 0 退出。0 通常表示成功,非零表示错误。
$1
永远只是一个选项,因此不需要循环它。另外,您的脚本似乎只应该接收一个目录作为一个参数,虽然这在技术上是一个文件,但它不会通过-f
测试。
grep -q "1000" $filename
将搜索文件中是否存在1000
,并且不会找到任何大于 1000 的数字,除非它们实际上也包含 1000 (即:101000
)。
您可以在目录上使用递归 grep 执行正则表达式搜索来查找 1000 或更大的数字:
grep -rE '[1-9][0-9]{3,}' "$1"
这将打印文件名并匹配,但如果您只想打印文件名,您可以执行以下操作:
grep -rEl '[1-9][0-9]{3,}' "$1"