我有一行评论。 我使用参数替换将行条件化为变量"源"。 测试语句显示源的值为"简单:",但 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:]]}}