在 shell 中使用正则表达式读取参数值

reading parameter value with regex in shell

我想简单地阅读这个文件

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

一些 shell 功能是这样的:

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

所以要检索文件中每个配置参数的内容(在“=”之后),我需要这样的东西:

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

这给了我

grep: syntax error in subpattern name (missing terminator)


注:

我正在使用来自 git bash (grep (GNU grep) 2.27)

的 grep

我会建议另一种正确的方法,使用关联数组

#!/bin/bash

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

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

现在使用声明的函数:

getParam foo
1

getParam bar
/^@djrhaali$$sdf

备注:

  • 在bash中,函数调用不像func(1)而是func 1
  • 您使用 grep 的解决方案不如此解决方案可靠
  • 不需要cat file | grep foobar但只需grep foobar file
  • 避免使用大写变量,它们保留供系统使用
  • 在shell学习如何正确引用,这很重要:

    "Double quote" every literal that contains spaces/metacharacters and every expansion: "$var", "$(command "$var")", "${array[@]}", "a & b". Use 'single quotes' for code or literal $'s: 'Costs US', ssh host 'echo "$HOSTNAME"'. See
    http://mywiki.wooledge.org/Quotes
    http://mywiki.wooledge.org/Arguments
    http://wiki.bash-hackers.org/syntax/words

shell 中的函数参数没有像 C 等其他语言中那样命名。它们由表示参数列表的特殊变量处理。例如"$@" 指的是整个参数列表。所以传递的第一个参数被命名为 </code>,<code> 直到最后一个参数。

shell 中的变量 不是 内插在单引号下。您需要将它们加双引号才能展开。

所报告的缺少终止符的问题是由于不正确的 PCRE 后视正则表达式,即缺少 = 符号

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

直接查看grep在输入文件上的用法,避免无用的调用cat。避免多次 grep 调用,您可以简单地使用 awk 作为

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

有了这个定义,您现在可以将函数用作

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