Jeff는 다음과 같이 썼습니다.음수로 명명된 파일 이름에 대한 매개변수 확장 오류
[[ $b =~ ^-0+([0-9]+)$ ]] && b=-${BASH_REMATCH[1]}
이 시점에서 가장 좋은 방향은 음수일 수 있는 숫자에서 앞에 오는 0을 제거하는 것과 같은 작업을 수행하는 것입니다.
0
패턴의 시작번호가 꼭 필요한지 궁금합니다. 즉, ^-0+([0-9]+)
패턴이 와 동일합니까 ^-0+([1-9]+)
? 감사해요.
답변1
아니요, ^-0+([1-9]+)
그런 숫자는 일치하지 않습니다 -320
.
-320
편집: 패턴을 다시 읽으면 실제로 불일치에 대한 두 가지 이유가 있습니다 .
0
뒤에는 '가 없습니다-
(+
반드시 있어야 한다고 말합니다). 그러나 이는 두 모드의 차이점이 아니며 결함일 수도 있습니다.0
0이 아닌 첫 번째 숫자 뒤에는 패턴 간의 차이가 있습니다.
답변2
동일한 문자열에 대한 일치 여부는 ^-0+([0-9]+)
로케일에 따라 다릅니다. C/POSIX 로케일에서는 동일한 문자열( 및 포함)과 일치하지만 캡처하는 내용은 다를 수 있습니다(예: 전자는 에서 캡처하고 후자는 에서 캡처).^-0+([1-9]+)
$
-01foo
-00230bar
(...)
230
-00230bar
23
@Henrik이 제안한 대로 를 사용하면 $
동일한 문자열에서 일치하지 않습니다. ^-0+([1-9]+)$
일치하지 않습니다 -00230
.
다른 지역에서는 마일리지가 다를 수 있습니다. 예를 들어, en_GB.UTF-8
Solaris 10 시스템의 로케일 에서 on은 중간에 정렬된 문자이므로 일치 ^-0+([0-9]+)
하므로 or 는 일치 하지만 ⓿ 또는 ⓿는 일치하지 않습니다.-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
.