bash 脚本中的 grep 命令

bash 脚本中的 grep 命令
grepstr()
{
 grep "$1 $2" $TMP/"ORACLE_SID"_dbmode.txt > /dev/null 2>$1
}
  1. 上述命令的含义是什么?
  2. 什么是$1$2为什么有必要?
  3. 有没有使用$1和的替代方法$2

答案1

代码确实是这样的吗?

事实上,它是一个接受两个参数的函数,假设它们是arg1arg2

然后,它读取一个名为的文件ORACLE_SID_dbmode.txt并打印包含arg1 arg2(中间有一个空格连接在一起)的每一行,并将错误消息保存在名为的文件中arg1

这很令人困惑,所以我不认为这是实际的代码。

我想象它实际上是这样的:

grepstr()
{
    grep "$1" "$2" $TMP/"$ORACLE_SID"_dbmode.txt >/dev/null 2>&1
}

变化:

  • "$1 $2"变成"$1" "$2"
  • ORACLE_SID变成$ORACLE_SID
  • 2>$1变成2>&1

如果是这样,它可以以两种方式使用:

grepstr options string_or_pattern

例如:

grepstr -i something

将使其打印(见下文)文件中"$ORACLE_SID"_dbmode.txt包含字符串somethingSomethingSOMETHING等的任何行。

-i表示不区分大小写,仅仅是一个例子;可以使用任何选项。

(此外,从技术上讲something它不是一个字符串,而是一种模式,例如[0-9]可以匹配任何数字)。

第二种方式是:

grepstr string_or_pattern filename

在这种情况下,它将打印与filename或中的 string_or_pattern 匹配的任何行"$ORACLE_SID"_dbmode.txt

这似乎不太可能,但还是有可能的,这取决于代码的使用方式。

也可以这样调用:

grepstr option1 option2

但这会从标准输入(例如默认的键盘)读取,并打印包含的任何行"$ORACLE_SID"_dbmode.txt,这几乎肯定不是预期的,因为它"$ORACLE_SID"_dbmode.txt看起来像一个文件名,而不是要匹配的字符串或模式。

如果我的猜测正确,代码就不是>/dev/null 2>$1,而是>/dev/null 2>&1,这意味着不会打印输出和错误消息。

>/dev/null意味着 grep 的标准输出(即匹配的行)被发送到/dev/null,这是一个操作系统会忽略的特殊文件。

2>&1after>/dev/null表示错误消息也会出现在那里。

因此,如果输出不重要,grepstr则可能被这样调用:

if grepstr...

或者像这样:

grepstr...
if [ $? -ne 0 ]

仅在匹配时执行一些代码。

回答你问题的另一部分,是的,可以改为

grepstr()
{
    grep "$@" $TMP/"$ORACLE_SID"_dbmode.txt > /dev/null 2>&1
}

扩展"$@""$1" "$2" "$3"...(即提供的尽可能多的参数)。

我认为那样会更好,因为它会更加灵活。

另一方面,如果由于某些我无法想到的原因它确实需要两个参数,那么也许这"$1" "$2"就是作者的意图。

答案2

$1$2是参数。您的代码片段正在定义函数grepstr

例如,运行

grepstr first second

实际运行命令

grep "first second" $TMP/"ORACLE_SID"_dbmode.txt

并将输出重定向到/dev/null(即消息接收器,放置在那里的所有内容都会消失)。

基本上,当你运行脚本(或函数)时,$1$2$3等是你提供的参数。你可以使用 来测试参数是否设置-z,例如if [ -z $3 ]; then ...

相关内容