如何在bash文件中制作自定义函数

Cou*_*000 1 bash shell-script bashrc bash-functions

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

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

但我想让它更容易,因为我有很多这样的检查。所以我在.bashrc

ok(){grep ERROR $filename}
Run Code Online (Sandbox Code Playgroud)

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

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

-bash: .bashrc: line 16: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)

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

-bash: ok: command not found
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我使用此自定义功能吗?或者我应该将我的代码粘贴到另一个设置文件中.bashrc-profile吗?

非常感谢!

ilk*_*chu 5

shell 对{ ... }构造的语法和空格非常挑剔。这两种设置该功能的方法将起作用:

ok() { grep ERROR $filename; }
ok() {
    grep ERROR $filename
}
Run Code Online (Sandbox Code Playgroud)

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

以下列表中的分号(或换行符)是必需的。

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

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

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

  • `grep ERROR $filename` 未设置 `$filename` 将展开并运行 `grep ERROR`,它等待键盘输入。它不仅仅是“需要很长时间才能运行”,它永远不会终止,除非您键入并以刷新(通常是 Ctrl-D)结束。 (2认同)
  • @Counter10000,像`grep ERROR $filename` 这样的命令会扩展变量`filename`,并在该文件上运行grep。但是如果变量没有设置,`grep` 不会得到文件名,而是开始读取标准输入,即终端。`grep ERROR "$filename"`(带引号)会给出错误,因为它会传递 `grep` 一个 _empty_ 字符串作为参数,这是一个无效的文件名 (2认同)