杰夫写于以负数命名的文件名的参数扩展错误
此时我最好的方向是做一些事情,比如
[[ $b =~ ^-0+([0-9]+)$ ]] && b=-${BASH_REMATCH[1]}
从可能为负数的数字中去除前导零
0
我想知道模式中的起始数字是否是必要的。换句话说,模式^-0+([0-9]+)
与 相同吗^-0+([1-9]+)
?谢谢。
答案1
不,^-0+([1-9]+)
与 之类的数字不匹配-320
。
编辑:重读模式,实际上有两个原因-320
不匹配,
0
the 之后没有's-
(并且+
说必须有) - 但这不是两种模式之间的区别(并且可能是它们的缺陷)0
第一个非零数字后面有一个- 这就是模式之间的区别。
答案2
是否在相同字符串上^-0+([0-9]+)
匹配将取决于区域设置。在 C/POSIX 语言环境中,它们将匹配相同的字符串(包括和),但 捕获的内容可能不同(例如,前者捕获on而后者捕获)。^-0+([1-9]+)
$
-01foo
-00230bar
(...)
230
-00230bar
23
使用$
,如 @Henrik 所示,它们不会在相同的字符串上匹配。^-0+([1-9]+)$
不会匹配-00230
.
在其他地区,您的里程可能会有所不同。例如,在en_GB.UTF-8
Solaris 10 系统上的区域设置中,^-0+([0-9]+)
将匹配 on,-0⓿⓿12
因为⓿
它是在中间排序的字符0
,因此与或1
匹配,但不会与 ⓿匹配,也不会匹配 ⓿。[0-1]
[0-9]
^-0+([1-9]+)
0+
[1-9]
为了完整起见,要使用标准sh
语法来执行此操作而不必依赖bash
/ksh93
扩展,您可以执行以下操作:
case ${b#-0} in
("$b" | "" | *[![:digit:]]*) echo >&2 no match;;
(*) b=${b#"${b%%[!0-]*}"};;
esac
这里的好处是[[:digit:]]
(相对于[0-9]
)仅匹配0123456789
。