чтение значения параметра с помощью регулярного выражения в оболочке - PullRequest
0 голосов
/ 09 января 2020

Я хочу просто прочитать этот файл

FOO=1
BAR=/^@djrhaali$$sdf

с помощью некоторой функции оболочки, подобной этой:

FOO=$(GetParam "FOO")
BAR=$(GetParam "BAR")

, чтобы получить содержимое каждого параметра конфигурации в файле (после "="), Мне нужно что-то вроде:

GetParam() {
   cat  myFile | grep '^${$1}=' | grep -oP '(?<${$1}=).*'
}

, что дает мне

grep: syntax error in subpattern name (missing terminator)


Примечание:

I ' м с помощью grep из git bash (grep (GNU grep) 2.27)

Ответы [ 2 ]

2 голосов
/ 09 января 2020

Я бы предложил другой правильный подход, используя * ассоциативный массив :

#!/bin/bash

declare -A arr
while IFS='=' read -r key value; do
    arr[$key]="$value"
done < InputFile

getParam() { echo "${arr[$1]}";  }

Теперь используя объявленную функцию:

getParam foo
1

и

getParam bar
/^@djrhaali$$sdf

Примечания:

  • в bash, вызов функции не похож на func(1), но func 1
  • ваше решение использование grep не так надежно, как это решение
  • не нужно делать cat file | grep foobar, а только grep foobar file
  • избегать использования переменных UPPER CASE, они зарезервированы для системного использования
  • научиться правильно заключать в кавычки в оболочке, это очень важно:

    "Двойная кавычка" для каждого литерала, содержащего пробелы / метасимволы и каждое расширение : "$var", "$(command "$var")", "${array[@]}", "a & b". Используйте 'single quotes' для кода или литерала $'s: 'Costs $5 US', ssh host 'echo "$HOSTNAME"'. См.
    http://mywiki.wooledge.org/Quotes
    http://mywiki.wooledge.org/Arguments
    http://wiki.bash-hackers.org/syntax/words

1 голос
/ 09 января 2020

Аргументы функции в оболочке не имеют имен, как в других языках, например C. Они обрабатываются специальными переменными, которые представляют список аргументов. Например, "$@" относится ко всему списку аргументов. Таким образом, первый переданный аргумент называется $1, $2 до последнего аргумента.

Также переменные в оболочке не интерполируются в одинарных кавычках. Вам нужно заключить их в двойные кавычки для расширения.

Сообщается о проблеме отсутствия терминатора из-за неправильного регулярного выражения PCRE, в котором отсутствует символ =

GetParam() {
    [ -z "$1" ] && { printf 'arg empty\n' >&2; }
    grep "${1}=" file | grep -oP "(?<=${1}=).*"
    #                               ^^^^ missing = symbol
}

Посмотрите на использование grep во входном файле напрямую, избегая бесполезного вызова cat. Избегая нескольких grep вызовов, вы можете просто использовать awk для этого как

GetParam() {
    [ -z "$1" ] && { printf 'arg empty\n' >&2; }
    awk -F= -v var="$1" '$1 == var { print $2 }' file 
}

С этими определениями теперь вы можете использовать функции как

fooval=$(GetParam FOO)
barval=$(GetParam BAR)
...