【问题标题】:What is the correct syntax to combine multiple parameter expansions?组合多个参数扩展的正确语法是什么?
【发布时间】:2020-07-26 22:25:02
【问题描述】:

我当前的代码:

while read -r rbv_line || [[ -n "$rbv_line" ]]; do
  if [[ "${rbv_line}" =~ ${rbv_reg} ]]; then
    rbv_downcase="${BASH_REMATCH[0],,}" &&
      ruby_version="${rbv_downcase//[^0-9a-z\.\-]/}" &&
      ((reg_matches="${reg_matches}"+1))
    printf "\n"
    printf "Setting Ruby version: %s\n" "${ruby_version}"
    break
  fi
done < "${1}" 

它做我想做的事。但我很想知道我是否可以进一步简化这段代码,希望有人能帮助我理解语法。

如果你看到这两行:

rbv_downcase="${BASH_REMATCH[0],,}" &&
  ruby_version="${rbv_downcase//[^0-9a-z\.\-]/}" &&

最初我尝试使用以下方法将它们组合成一个:

ruby_version="${BASH_REMATCH[0],,//[^0-9a-z\.\-]/}"

这行不通。

有没有办法将这两个参数扩展(,,//[^0-9a-z\.\-]/)结合起来,或者通过中间变量传递它是正确的方法?

您可以在此处查看最新版本的代码: https://github.com/octopusnz/scripts

【问题讨论】:

  • 您不能像这样组合多个替换。如果我们知道输入和预期输出是什么,我们也许可以找到一种更简单的方法来提取它。
  • 你应该给出输入样本和预期输出。

标签: bash shell variables refactoring simplify


【解决方案1】:

您不能组合多个参数扩展,但是...


...您可以简化此代码!

最大的收获是使用现有的工具。

  1. 我们不用循环,而是使用grep。它应该在发生 RegEx 模式时做一些事情,所以:
grep -E "$rbv_reg" "$1" # -E is for extended RegEx
  1. 我猜你的模式不区分大小写,所以让我们用-i 标志禁用它。
  2. 匹配后循环中断,所以让我们传递-m 1 以在第一次匹配后停止处理文件。
  3. 您想将大写转换为小写,所以让我们通过tr 进行管道传输:
grep -m 1 -E -i "$rbv_reg" "$1" | tr '[:upper:]' '[:lower:]'
  1. 然后您将一些字符替换为 //[^0-9a-z\.\-]/,将其传递给 sed 即可:
grep -m 1 -E -i "$rbv_reg" "$1" | tr '[:upper:]' '[:lower:]' | sed 's/[^0-9a-z\.\-]//g'
  1. 最后,让我们将输出抓取到变量:
ruby_version="$( grep -m 1 -E -i '$rbv_reg' '$1' | tr '[:upper:]' '[:lower:]' | sed 's/[^0-9a-z\.\-]//g' )"
  1. 既然你要打印新行,让我们使用简单的echo 而不是printf
  2. 剩下的就是if [ -n "$ruby_version" ] 递增reg_matches

最后,我们得到:

ruby_version="$(
    grep -m 1 -E -i '$rbv_reg' '$1' |
    tr '[:upper:]' '[:lower:]' |
    sed 's/[^0-9a-z\.\-]//g'
)"

if [ -n "$ruby_version" ]; then
    reg_matches="$((reg_matches+1))"
    echo
    echo "Setting Ruby version: $ruby_version"
fi

上述代码的优势在于它并不真正依赖于 Bash,并且应该可以在任何 POSIX Bourne 兼容的 shell 中工作。

【讨论】:

  • 感谢您提供如此详细的回答,非常感谢。
猜你喜欢
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 2020-04-21
  • 2018-05-30
  • 2020-08-18
  • 2011-07-08
  • 2011-06-11
  • 1970-01-01
相关资源
最近更新 更多