tat*_*tsu 3 bash shell scripting
我看不到让它工作:
echo $VERSIONNUMBER
Run Code Online (Sandbox Code Playgroud)
我得到:v0.9.3-beta
VERSIONNUMBERNAME=${VERSIONNUMBER:1}
echo $VERSIONNUMBERNAME
Run Code Online (Sandbox Code Playgroud)
我得到:0.9.3-beta
VERSION=${VERSIONNUMBERNAME/./_}
echo $VERSION
Run Code Online (Sandbox Code Playgroud)
我得到:0_9.3-beta
我想要:0_9_3-beta
我一直在用谷歌搜索我的大脑,我无法弄清楚它的正面或反面。
理想情况下,我想删除 v 并在一行中用下划线替换句点。
让我们创建您的变量:
$ VERSIONNUMBER=v0.9.3-beta
$ VERSIONNUMBERNAME=${VERSIONNUMBER:1}
Run Code Online (Sandbox Code Playgroud)
此形式仅替换第一次出现的.:
$ echo "${VERSIONNUMBERNAME/./_}"
0_9.3-beta
Run Code Online (Sandbox Code Playgroud)
要替换所有出现的.,请使用:
$ echo "${VERSIONNUMBERNAME//./_}"
0_9_3-beta
Run Code Online (Sandbox Code Playgroud)
因为这种方法避免了管道和子外壳的创建以及外部可执行文件的使用,所以这种方法是有效的。这种方法也是 unicode 安全的。
来自man bash:
${参数/模式/字符串}
模式替换。 模式被扩展以产生一个模式,就像在路径名扩展中一样。参数被扩展,并且模式与其值的最长匹配被替换为字符串。 如果模式以 / 开头,则模式的所有匹配项都将替换为字符串。 通常只替换第一个匹配项。 如果模式以# 开头,则它必须匹配参数扩展值的开头。如果模式以 % 开头,则它必须匹配参数扩展值的末尾。如果 string 为空,则删除模式的匹配项,并且可以省略 / 后面的模式。如果启用了 nocasematch shell 选项,则执行匹配时不考虑字母字符的大小写。如果参数为@或*,则对每个位置参数依次进行替换操作,展开后即为结果列表。如果参数是一个带有@或*下标的数组变量,则对数组的每个成员依次进行替换操作,展开的就是结果列表。(加了重点。)
您可以将模式替换与tr:
VERSION=$( echo ${VERSIONNUMBER:1} | tr '.' '_' )
Run Code Online (Sandbox Code Playgroud)