【问题标题】:bash pattern replacement working on terminal but not working in script [closed]bash模式替换在终端上工作但在脚本中不起作用[关闭]
【发布时间】:2021-07-30 13:07:44
【问题描述】:

我在使用 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 上运行)

【问题讨论】:

  • 你的终端正在运行 zsh。没有 bash 版本支持(pattern|pattern)
  • 完全正确。我的错误,谢谢指出:)
  • 同样在zsh 中,执行不带shebang 的脚本会导致脚本以sh 执行(在macOS 上恰好是bash)。 bash --version 并没有真正告诉您有关执行脚本的任何信息,只是告诉您您的计算机上安装了 3.2.57 版本。

标签: linux bash terminal


【解决方案1】:

bash 模式匹配在3.5.8.1 Pattern Matching的手册中有描述

在 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"

【讨论】:

    猜你喜欢
    • 2019-09-30
    • 2018-11-30
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    相关资源
    最近更新 更多