linux - bash 模式替换在终端上工作但在脚本中不工作
问题描述
我在使用 bash 模式替换时遇到了一个奇怪的问题。运行以下命令时,我希望得到相同的输出:
% cat test.sh
bash --version
VAR_FOO=masked::required::VALUE
VARIABLE_NAME=${VAR_FOO//(required|masked)::/}
echo $VARIABLE_NAME
% ./test.sh
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin20)
Copyright (C) 2007 Free Software Foundation, Inc.
masked::required::VALUE
% bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin20)
Copyright (C) 2007 Free Software Foundation, Inc.
% VAR_FOO=masked::required::VALUE
% VARIABLE_NAME=${VAR_FOO//(required|masked)::/}
% echo $VARIABLE_NAME
VALUE
相反,在 .sh 文件中运行命令时,模式替换不起作用。如您所见,它似乎使用的是相同的 bash 版本。我不知道是什么导致了这个问题。任何帮助将不胜感激!
(为了完整性:在 macOS 11.5 上运行)
解决方案
bash 模式匹配在手册3.5.8.1 模式匹配中进行了描述
在 bash 中,你必须这样做:
shopt -s extglob # enable "extended" patterns
VAR_FOO=masked::required::VALUE
# using `@(patt1|patt2|...)` to mean "match one of the following patterns"
# - replacing with "x" to show the replacements
VARIABLE_NAME=${VAR_FOO//@(required|masked)::/x}
declare -p VAR_FOO VARIABLE_NAME
输出
declare -- VAR_FOO="masked::required::VALUE"
declare -- VARIABLE_NAME="xxVALUE"
推荐阅读
- ios - 如何正确打开 IPv6 上的 url?
- javascript - 如何使用 onChange 事件将对象值传递给 select 标签?
- input - 如何处理国家代码和中继前缀以在网站上为输入字段发送短信
- matlab - 在 Matlab 中使用 octaveFilter 的意外结果
- python - 以下哪一项是余弦衰减(神经网络的学习率重新加权)的正确实现?
- mysql - mySQL Workbench:根据另一个表中的数据查询以更新表
- javascript - setInterval 的问题
- unity3d - 统一启用禁用和共享
- powershell - 如何为具有多个小数的值范围编写 Pester 单元测试
- c# - 如何验证使用 Entity Framework fluent API 创建的模型?