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' )"