grepstr()
{
grep "$1 $2" $TMP/"ORACLE_SID"_dbmode.txt > /dev/null 2>$1
}
- 上述命令的含义是什么?
- 什么是
$1
?$2
为什么有必要? - 有没有使用
$1
和的替代方法$2
?
答案1
代码确实是这样的吗?
事实上,它是一个接受两个参数的函数,假设它们是arg1
和arg2
。
然后,它读取一个名为的文件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
包含字符串something
、Something
、SOMETHING
等的任何行。
-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>&1
after>/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 ...
。