如何在bash文件中创建自定义函数

如何在bash文件中创建自定义函数

我正在寻找一种在其中一个设置文件中创建自定义函数的方法,以便当我打开新会话时,可以评估(或获取)相同的自定义函数,并且我可以轻松使用该函数。

我尝试创建一个函数来检查ERROR日志文件中是否存在,因此当我检查日志文件时,我只需键入函数名称和日志文件名即可。现在我正在使用 grep:grep ERROR test.txt

但我想让事情变得更容易,因为我有很多这样的检查。所以我在中添加这一行.bashrc

ok(){grep ERROR $filename}

当我使用该函数时,我希望输入:ok test.txt 并且它应该给我错误行(如果有)。

但是,在评估该.bashrc文件后,我收到一条错误消息:

-bash: .bashrc: line 16: syntax error: unexpected end of file

当我输入: 后ok test.txt,它提供:

-bash: ok: command not found

有人可以帮我实现这个定制功能吗?或者我应该将代码粘贴到另一个设置文件中,例如.bashrc-profile

预先非常感谢!

答案1

shell 对{ ... }结构的语法和空格非常挑剔。设置该功能的两种方法都可以:

ok() { grep ERROR $filename; }
ok() {
    grep ERROR $filename
}

关于大括号{ .. }与圆括号( .. )Bash 的手册指出:

后面的分号(或换行符)列表是必须的。

大括号是保留字,因此必须将它们与列表由空格或其他 shell 元字符组成。

列表指大括号内的命令,所有这些都适用于{ ... }使用过的地方,但函数可能是最常见的地方。

另外,如果您希望能够将文件名作为函数的参数,请$1在其中使用。即ok() { grep ERROR "$1"; }可以用作ok test.txt.

答案2

不必如此,你会感到自由并从中受益匪浅

ok() { set -f
if test -z "$2"
then
  grep -HPine "$1" -r --include=*.log --include=*.txt
else
  grep -HPine "$1" -r --include="$2"
fi
}

$ ok error test.txt
$ ok err test.txt
$ ok error
$ ok 'err|warn'
$ ok error logdata.*

第三次用法将在当前目录中的所有目录中查找具有 log 和 txt 扩展名的所有文件中具有“error”字符串的所有行
第四次用法将在具有 log 和 txt 扩展名的所有文件中查找具有“error”或“warn”字符串的所有行当前目录中的所有目录
第五个将在当前目录中的所有目录中查找所有名为 logdata 且具有任何扩展名的文件中包含“error”字符串的行

相关内容