grepstr()
{
 grep "$1 $2" $TMP/"ORACLE_SID"_dbmode.txt > /dev/null 2>$1
}
  1. В чем смысл вышеуказанной команды?
  2. Что такое $1 и $2? Зачем это надо?
  3. Есть ли альтернативы для использования $1 и $2?

2 ответа2

3

Это именно то, на что похож код?

На самом деле это функция, которая принимает два аргумента, скажем, они 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

в этом случае он напечатает любые строки, соответствующие string_or_pattern в filename или "$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 после >/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" - это то, что задумал автор.

0

$1 и $2 являются параметрами. Ваш фрагмент определяет функцию grepstr .

Например, бег

grepstr first second

на самом деле запускает команду

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

и перенаправляет вывод в /dev/null (который является приемником сообщений, все помещенное туда просто исчезает).

По сути, когда вы запускаете скрипт (или функцию), $1 , $2 , $3 (и т.д.) - это заданные вами параметры. Вы можете проверить, установлен ли параметр с помощью -z , например, if [ -z $3 ]; then ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .