在 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
我会建议另一种正确的方法,使用bash的关联数组:
#!/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)
我想简单地阅读这个文件
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我会建议另一种正确的方法,使用bash的关联数组:
#!/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)