Bash 组合多个参数扩展的正确语法是什么?

Bash 组合多个参数扩展的正确语法是什么?,bash,shell,variables,refactoring,simplify,Bash,Shell,Variables,Refactoring,Simplify,我当前的代码: 读取时-r rbv|||[[-n“$rbv|u line”]];做 如果[“${rbv_line}”=~${rbv_reg}];然后 rbv_downcase=“${BASH_重新匹配[0],}”&& ruby_version=“${rbv_downcase/[^0-9a-z\.\-]/}”&& ((reg_matches=“${reg_matches}”+1)) printf“\n” printf“正在设置Ruby版本:%s\n”“${Ruby\u version}” 打破 f

我当前的代码:

读取时-r rbv|||[[-n“$rbv|u line”]];做
如果[“${rbv_line}”=~${rbv_reg}];然后
rbv_downcase=“${BASH_重新匹配[0],}”&&
ruby_version=“${rbv_downcase/[^0-9a-z\.\-]/}”&&
((reg_matches=“${reg_matches}”+1))
printf“\n”
printf“正在设置Ruby版本:%s\n”“${Ruby\u version}”
打破
fi
完成<“${1}”
它符合我的要求。但是我很想知道我是否可以进一步简化这段代码,希望有人能帮助我理解语法

如果您看到这两行:

rbv_downcase=“${BASH_重新匹配[0],}”&&
ruby_version=“${rbv_downcase/[^0-9a-z\.\-]/}”&&
最初,我尝试使用以下方式将这些内容合并为一个:

ruby\u version=“${BASH\u重新匹配[0],//[^0-9a-z\.\-]/}”
这是行不通的

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

您可以在此处查看代码的最新版本:
您不能组合多个参数展开,但


。。。您可以简化此代码

最大的好处是使用已有的工具

  • 我们用
    grep
    代替循环。它应该在正则表达式模式出现时执行某些操作,因此:
  • grep-E“$rbv_reg”“$1”#-E表示扩展正则表达式
    
  • 我猜您的模式不区分大小写,所以让我们使用
    -I
    标志禁用它
  • 循环在匹配后中断,所以让我们传递
    -m1
    以在第一次匹配后停止处理文件
  • 您希望将大写转换为小写,因此让我们通过管道将其传递到
    tr
  • grep-m1-E-i“$rbv_reg”“$1”| tr'[:上限:'[:下限:''
    
  • 然后用
    /[^0-9a-z\.\-]/
    替换一些字符,将其输送到
    sed
    将实现以下功能:
  • grep-m1-E-i“$rbv_reg”“$1”| tr'[:上限:'[:下限:''.\sed's/[^0-9a-z\.-]//g”
    
  • 最后,让我们获取变量的输出:
  • 既然您正在打印新行,那么让我们使用简单的
    echo
    而不是
    printf
  • 剩下的就是
    如果[-n“$ruby\u version”]
    增加
    reg\u匹配项
  • 最后,我们得到:

    ruby\u版本=”$(
    grep-m1-E-i'$rbv_reg'$1'|
    tr'[:上:'[:下:''|
    sed's/[^0-9a-z\.-]//g'
    )"
    如果[-n“$ruby_version”];然后
    reg_matches=“$((reg_matches+1))”
    回声
    echo“设置Ruby版本:$Ruby\u版本”
    fi
    

    上述代码的优点是它实际上并不依赖于Bash,应该可以在任何与POSIX-Bourne兼容的shell中工作。

    这样的替换不能组合多个。如果我们知道输入和预期输出是什么,我们可能会找到一种更简单的方法来提取。您应该提供输入样本和预期输出。感谢您提供如此详细的答案,非常感谢。
    ruby_version="$( grep -m 1 -E -i '$rbv_reg' '$1' | tr '[:upper:]' '[:lower:]' | sed 's/[^0-9a-z\.\-]//g' )"