산술 대체의 명령 대체가 단어 분할로 이어질까요?

산술 대체의 명령 대체가 단어 분할로 이어질까요?

이 사이트의 댓글에서 산술 확장이 기억나는 것 같습니다.가능한분사되었지만 더 이상 댓글을 찾을 수 없습니다.

다음 코드를 고려해보세요.

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):

산술 확장

표현식의 모든 토큰은 매개변수 확장, 문자열 확장, 명령 대체 및 따옴표 제거를 거칩니다.

따라서 분할이 수행되지 않습니다.

관련 정보