![正则表达式的 $ 字符](https://linux22.com/image/84399/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%9A%84%20%24%20%E5%AD%97%E7%AC%A6.png)
我知道当我使用 时$
,这意味着之前的字符$
必须显示在字符串的末尾。
a
但是,当变量为整数时,我不知道下面给出的测试之间的区别:
[[ a =~ -?[0-9]+ ]]
[[ a =~ ^-?[0-9]+$ ]]
它们相同吗?
答案1
不,表达方式[0-9]+
和[0-9]+$
不一样。第一个将匹配一个或多个数字在任何位置在字符串中,后者将仅有的匹配一系列一个或多个数字结尾字符串的。为了进行演示,我将使用此脚本根据其第一个参数测试您的表达式:
#!/bin/bash
a=$1
if [[ $a =~ -?[0-9]+ ]]; then
echo "match to first expression"
else
echo "no match to first expression"
fi
if [[ $a =~ ^-?[0-9]+$ ]]; then
echo "match to second expression"
else
echo "no match to second expression"
fi
结果如下:
$ ./test.sh 12345
match to first expression
match to second expression
$ ./test.sh 12345AA
match to first expression
no match to second expression
答案2
不;两种表达方式不同。
[[ a =~ -?[0-9]+ ]]
将测试 a 在任何位置是否包含整数。它可以位于字符串中的任何位置;没关系。
但
另一方面,[[ a =~ ^-?[0-9]+$ ]]
将测试 a 是否仅由整数组成(带有可选的 - 作为第一个字符),因为 ^ 表示测试字符串的开头,而 $ 标记字符串的结尾。
这意味着在第二个表达式中,字符串中任何位置的任何非数字都不会匹配。