下面的字符串我需要比较条件运算符。因此,只有当 81.1.4_r4345 执行某些操作或匹配“done”时,才会执行某些操作。
vasanth-releases_81.1.4_r4345.tar.gz
vasanth-releases-done.tar.gz
If [[ $var == ‘vasanth-releases_{0-9}_{0-9}.tar.gz ]] ; then
echo ‘True’
Elsif [[ $var == ‘Vasanth-releases-{a-z}.tar.gz ]]; then
echo ‘False’
else
echo ‘default’
fi
以上尝试未按预期工作。所以这两个文件需要正则表达式格式。你能帮忙解决这个问题吗
谢谢
答案1
我不太确定您的最终目标是什么,但我可以指出您的代码的一些问题:
- 您不应在 shell 命令或内置命令中使用大写字母,因此
If
应该if
elsif
无效,应该是elif
- 您使用“智能引号”可能是因为从不适合代码编辑的文字处理器中复制出来。
- 即使智能引号更改为常规引号,您也会在第一个条件中打开单引号,并且在第二个条件之前不会再次关闭它。
- 在 bash 中,您需要使用
=~
运算符进行正则表达式比较,而不是==
运算符。 - 大括号不能完成您在正则表达式中想要完成的任务,您需要使用
[0-9]
并[a-z]
匹配这些范围内的任何字符。 - 即使您修复了正则表达式中的括号,它们仍然与您的文件不匹配。您可以尝试使用 regex101.com 构建正确的正则表达式,但请注意 bash 会扩展正则表达式,这在 regex101 上不是可用的选项,pcre 很接近,但您会发现一些不交叉兼容的东西。
答案2
正在寻找这样的东西吗?
#!/bin/bash
var="vasanth-releases_81.1.4_r4345.tar.gz"
if [[ $var =~ ^vasanth-releases_[0-9.]+_r[0-9]+\.tar\.gz$ ]]; then
echo ‘True’
elif [[ $var =~ ^vasanth-releases-[a-z]+\.tar\.gz$ ]]; then
echo ‘False’
else
echo ‘default’
fi
var="vasanth-releases-done.tar.gz"
if [[ $var =~ ^vasanth-releases_[0-9.]+_r[0-9]+\.tar\.gz$ ]]; then
echo ‘True’
elif [[ $var =~ ^vasanth-releases-[a-z]+\.tar\.gz$ ]]; then
echo ‘False’
else
echo ‘default’
fi