为什么我的变量在测试语句中起作用,但在 case 语句中不起作用,直到我使用 echo 将其读入自身?



我有一行评论。 我使用参数替换将行条件化为变量"源"。 测试语句显示源的值为"简单:",但 case 语句无法匹配它。 如果我使用命令替换到"source=$(echo $source(",测试说它匹配,就像以前一样,并且 case 语句现在可以工作了。 我是否缺少一些基本的东西,我不应该使用参数替换来执行此操作,还是这很奇怪? Bash 版本:GNU bash,版本 4.4.20(1(-release (x86_64-pc-linux-gnu(。 感谢您的观看。

将线路管道连接到带有回声的 sed 按预期工作。 如果未对变量执行参数替换,则 case 将按预期工作。示例:line="Simple:" 和大小写 $line in ...没问题。

#!/bin/bash
line="Simple: #comment and space to be removed"
source=${line//#*}
source=${source//^[[:space:]]*}
source=${source//*[[:space:]]$}
[[ $source =~ 'Simple:' ]] && echo -e "n1st test match" || echo -e "nno 1st test match"
case $source in
'Simple:')  
ops="Simple"
echo -e "n1st try case match.  Ops is $ops"
;;
*)
echo -e "nno natch in 1st case"
;;
esac
source=$(echo $source)
[[ $source =~ 'Simple:' ]] && echo -e "n2nd test match" || echo -e "nno 2nd test match"
case $source in
'Simple:')  
ops="Simple"
echo -e "n2nd try case match.  Ops is $ops"
;;
*)
echo -e "nno match 2nd case"
;;
esac

我希望"简单:"在第一个案例语句中匹配,但直到我运行"source=$(echo $source("才匹配。

引用man bash

${parameter/pattern/string}

模式替换。pattern被展开以产生模式,就像在路径名扩展中一样,参数被展开,pattern与其值的最长匹配项将替换为string。...

这意味着,这些行:

source=${source//^[[:space:]]*}
source=${source//*[[:space:]]$}

什么都不做,^$在路径名扩展中不起作用;pattern不是正则表达式。source=$(echo $source)使它起作用,因为$source不在双引号中,因此其值会进行单词拆分,并且末尾的空格会丢失。

使用参数扩展执行此操作的正确方法是:

source=${line%%#*}
source=${source#${source%%[^[:space:]]*}}
source=${source%${source##*[^[:space:]]}}

最新更新