我正在使用以下逻辑查看简单的for循环:
variable=`some piped string`
array_value=(1.1 2.9)
for i in ${array_value[@]}; do
if [[ "$variable" == *some_text*"$array_value" ]]; then
echo -e "Info: Found a matching string"
fi
问题在于,当它找到以1.1或2.9结尾的字符串作为样本数据时,我无法告诉我。
如果我在for循环中执行echo $array_value
,我可以看到正在采用数组值,因此正在解析其值,尽管if循环不会返回该echo消息,尽管字符串是本。
LE: 根据收到的评论,我已经将代码抽象为类似的东西,如果我想在比较引用中使用通配符,它仍然无法工作
versions=(1.1 2.9)
string="system is running version:2.9"
for i in ${versions[@]}; do
if [[ "$string" == "system*${i}" ]]; then
echo "match found"
fi
done
任何类似于" system * $ {i}"的结构或" * $ {i}"但是如果我指定完整的字符串模式它将起作用。
答案 0 :(得分:0)
测试构造的问题与您的if
语句有关。要在将要评估的表单中构造if
语句,请使用:
if [[ "$variable" == "*some_text*${i}" ]]; then
注意: *some_text*
需要替换为不带*
通配符的实际文本。如果文本中需要*
,则需要关闭globbing以防止shell扩展。如果扩展是您的目标,请使用大括号保护变量i
。
将*some_text*
置于变量i
之上没有错,但根据some_text的长度,它更清晰,可以将它分配给变量本身。容纳这种情况的最简单方法是定义一个变量来保存您需要的some_text
。 E.g:
prefix="some_text"
if [[ "$variable" == "${prefix}${i}" ]]; then
如果您还有其他问题,请询问。
答案 1 :(得分:-1)
将"system*${i}"
更改为system*$i
。
在[[ ... ]]
内包含引号会将通配符*
视为文字字符而无效。
或者,如果您希望将匹配分配给变量:
match="system*"
然后你可以这样做:
[[ $string == $match$i ]]
由于$string
内未执行分词,因此您实际上不需要[[ ... ]]
左右的引号。
来自man bash:
[[ expression ]]
...
Word splitting and pathname expansion are not
performed on the words between the [[ and ]]
...
Any part of the pattern may be quoted to force
the quoted portion to be matched as a string.