- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 bash 运算符 +~
首先拆分一个字符串,然后再次检查生成的字符串。当我尝试这个时,如果发现 BASH_REMATCH
的元素被第二次使用覆盖,所以 mother-function 在第二次使用时失败。
以下面构造的例子为例:
#!/bin/bash
inputline="abc123ABC123abc,xyz890XYZ890xyz"
checkABC ()
{
local teststring="$1"
local pattern="([^,]+),(.*)"
if [[ $teststring =~ $pattern ]]; then
echo "${BASH_REMATCH[1]}; ${BASH_REMATCH[2]}"
checkNum ${BASH_REMATCH[1]}
checkNum ${BASH_REMATCH[2]}
fi
}
checkNum ()
{
if [[ $1 =~ [a-z]+([0-9]+)[A-Z]+([0-9]+)[a-z]+ ]]; then
echo "${BASH_REMATCH[1]}; ${BASH_REMATCH[2]}"
fi
}
set -x
checkABC $inputline
这将给出以下输出,我们可以看到,${BASH_REMATCH[2]}
是如何被函数 checkNum
覆盖的。
$ bash ./leaking.sh
+ checkABC abc123ABC123abc,xyz890XYZ890xyz
+ local teststring=abc123ABC123abc,xyz890XYZ890xyz
+ local 'pattern=([^,]+),(.*)'
+ [[ abc123ABC123abc,xyz890XYZ890xyz =~ ([^,]+),(.*) ]]
+ echo 'abc123ABC123abc; xyz890XYZ890xyz'
abc123ABC123abc; xyz890XYZ890xyz
+ checkNum abc123ABC123abc
+ [[ abc123ABC123abc =~ [a-z]+([0-9]+)[A-Z]+([0-9]+)[a-z]+ ]]
+ echo '123; 123'
123; 123
+ checkNum 123
+ [[ 123 =~ [a-z]+([0-9]+)[A-Z]+([0-9]+)[a-z]+ ]]
我知道我可以通过将重新匹配的结果复制到另一个数组来防止这种情况,我可以在本地处理它并在其上应用 checkNum
(请参见下面的示例)。这是明智的做法吗?还是有更好的方法来防止 BASH_REMATCH
从函数中泄漏出来?
这段代码
#!/bin/bash
inputline="abc123ABC123abc,xyz890XYZ890xyz"
checkABC ()
{
local teststring="$1"
local pattern="([^,]+),(.*)"
local -a storeRematch
if [[ $teststring =~ $pattern ]]; then
storeRematch=("${BASH_REMATCH[@]}")
echo "${storeRematch[1]}; ${storeRematch[2]}"
checkNum ${storeRematch[1]}
checkNum ${storeRematch[2]}
fi
}
checkNum ()
{
if [[ $1 =~ [a-z]+([0-9]+)[A-Z]+([0-9]+)[a-z]+ ]]; then
echo "${BASH_REMATCH[1]}; ${BASH_REMATCH[2]}"
fi
}
set -x
checkABC $inputline
像我希望的那样执行:
bash ./notleaking.sh
+ checkABC abc123ABC123abc,xyz890XYZ890xyz
+ local teststring=abc123ABC123abc,xyz890XYZ890xyz
+ local 'pattern=([^,]+),(.*)'
+ local -a storeRematch
+ [[ abc123ABC123abc,xyz890XYZ890xyz =~ ([^,]+),(.*) ]]
+ storeRematch=("${BASH_REMATCH[@]}")
+ echo 'abc123ABC123abc; xyz890XYZ890xyz'
abc123ABC123abc; xyz890XYZ890xyz
+ checkNum abc123ABC123abc
+ [[ abc123ABC123abc =~ [a-z]+([0-9]+)[A-Z]+([0-9]+)[a-z]+ ]]
+ echo '123; 123'
123; 123
+ checkNum xyz890XYZ890xyz
+ [[ xyz890XYZ890xyz =~ [a-z]+([0-9]+)[A-Z]+([0-9]+)[a-z]+ ]]
+ echo '890; 890'
890; 890
最佳答案
有点 hack,但由于它仅在当前 shell 中是本地的,因此您可以在函数中运行子 shell。
checkNum ()
{
(
if [[ $1 =~ [a-z]+([0-9]+)[A-Z]+([0-9]+)[a-z]+ ]]; then
echo "${BASH_REMATCH[1]}; ${BASH_REMATCH[2]}"
fi
)
}
或
(
checkNum ${BASH_REMATCH[1]}
checkNum ${BASH_REMATCH[2]}
)
这将防止 BASH_REMATCH 对两个函数都是全局的。
除此之外,我认为将它分配给另一个数组是您将获得的最好结果(实际上比这个更好,因为它不会打开新的进程/子 shell)。
关于bash - 如何防止 BASH_REMATCH 泄漏出函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37674871/
zsh中的$BASH_REMATCH等价于什么,如何使用? 最佳答案 要使zsh的行为与bash相同,请使用: setopt BASH_REMATCH 或在函数内考虑: setopt local_op
我试图在 bash 中捕获路径的一部分: 输入:/Users/foo/.virtualenvs/venv-test-server 代码: #!/bin/zsh regex="^.*\/venv-(.*
上下文 我正在尝试使用正则表达式从 github https 克隆链接中提取存储库名称,但我似乎无法让 BASH_REMATCH 工作。 对于上下文,我将其编写为 .sh 文件并在 Git Bash
我在使用正则表达式时遇到问题,我需要搜索并删除与正则表达式匹配的模式,当找到时我需要修剪掉。我写了一个这样的正则表达式 regex='(.*)((aa[[:space:]]bb)|(awd)|(bab
我想使用 bash 运算符 +~ 首先拆分一个字符串,然后再次检查生成的字符串。当我尝试这个时,如果发现 BASH_REMATCH 的元素被第二次使用覆盖,所以 mother-function 在第二
代码是这样的: #!/bin/bash if [[ foobarbletch =~ 'foo(bar)bl(.*)' ]] then echo "The regex matches!"
我正在尝试使用以下正则表达式在 FOO_FOO_FOO_BAR_BAR 中捕获 BAR_BAR:(?:.*?_){3}(.*). 正则表达式在使用 RegExr 或 regex101 等验证器时有效,
我在 release notes of Bash 5.1 中读到: p. BASH_REMATCH is no longer readonly. 如 Bash Reference Manual 中所述
假设我有一个(愚蠢的例子)脚本: #!/bin/bash st="one two three" [[ $st =~ ^([[:alpha:]]+)[[:space:]]([[:alpha:]]+)[[
我是一名优秀的程序员,十分优秀!