이 사이트의 댓글에서 산술 확장이 기억나는 것 같습니다.가능한분사되었지만 더 이상 댓글을 찾을 수 없습니다.
다음 코드를 고려해보세요.
printf '%d\n' "$(($(sed -n '/my regex/{=;q;}' myfile)-1))"
sed
명령이 여러 자리를 출력하고 숫자를 포함하는 경우 $IFS
명령 대체는 산술이 발생하기 전에 단어 분할을 수행합니까?
(추가 큰따옴표를 사용하여 테스트했습니다.
printf '%d\n' "$(("$(sed -n '/my regex/{=;q;}' myfile)"-1))"
그러나 이것은 작동하지 않습니다. )
그런데 위의 샘플 코드는 변경 사항을 적용하여 가장 간단한 형태로 축소되었습니다.이 기능방금 Stack Overflow에 글을 올렸습니다.
답변1
아니요, 그렇지 않습니다.
존재하다 $((expression))
,표현하다다음과 같이 큰따옴표로 묶인 것으로 처리됩니다.POSIX 지정.
그러나 명령 대체 내의 표현식은 여전히 다음의 영향을 받습니다 split+glob
.
$ printf '%d\n' "$(( $(IFS=0; a=10; echo $a) + 1 ))"
2
큰따옴표 사용:
$ printf '%d\n' "$(( $(IFS=0; a=10; echo "$a") + 1 ))"
11
다른 확장과 마찬가지로 산술 확장도 큰따옴표로 묶지 않으면 진행됩니다 split+glob
.
$ IFS=0
$ echo $((10))
1
답변2
bash 매뉴얼에서 (실행 중 LESS=+/'^ *Arithmetic Expansion' man bash
):
산술 확장
표현식의 모든 토큰은 매개변수 확장, 문자열 확장, 명령 대체 및 따옴표 제거를 거칩니다.
따라서 분할이 수행되지 않습니다.