변수를 사용하지 않고 단어 분할을 위해 공백이 아닌 구분 기호를 사용할 수 있는 방법이 있습니까?

변수를 사용하지 않고 단어 분할을 위해 공백이 아닌 구분 기호를 사용할 수 있는 방법이 있습니까?

내가 다음과 같이 하면:

IFS=,
x=hello,hi,world
echo $x

그런 다음 세 개의 매개변수(및 각각 hello)가 추출되어 에 전달됩니다.hiworldecho

하지만 변수를 사용하지 않을 때는 다음과 같습니다.

IFS=,
echo hello,hi,world bye

그런 다음 단어 분할은 쉼표 구분 기호 대신 공백 구분 기호를 사용하여 수행되므로 생성되어 전달되는 두 인수는 및 가 echo됩니다 .hello,hi,worldbye

변수를 사용하지 않고 단어 분할을 위해 공백이 아닌 구분 기호를 사용할 수 있는 방법이 있습니까?

답변1

아니요, 토큰화는 명령줄(예: 최신 셸)에서 직접 제공되는 것이 아니라 확장 후에만 발생합니다. 이것POSIX의 텍스트설명하다:

2.6.5 필드 분할
매개변수 확장(Parameter Expansion), 명령 대체(Command Substitution), 산술 확장(Arithmetic Expansion) 후,쉘은 확장 및 대체 결과를 스캔해야 합니다.이는 필드로 구분된 큰따옴표 내에서는 발생하지 않으며 여러 필드가 발생할 수 있습니다.

(강조는 내 것)

그리고불다:

쉘은 단어 분할을 위해 큰따옴표 안에 표시되지 않는 인수 확장, 명령 대체 및 산술 확장의 결과를 스캔합니다.

문자열이 스크립트에 직접 있으면 쉼표를 공백으로 바꿀 수 있으므로 무엇이 문제인지 잘 모르겠습니다. 외부에서 오는 경우 일반적으로 명령 대체나 사용 read등 으로 인해 자연스럽게 분할이 발생합니다.


원래 Bourne 쉘에서는 동작이 약간 달랐습니다.@stefanchazeras 이 논의되었다다른 질문에 대한 답변곧 돌아오세요

답변2

명령줄의 첫 번째 분할은 메타 문자에서 수행됩니다.

메타문자
인용되지 않은 경우 단어를 구분하는 데 사용되는 문자입니다. 다음 중 하나:
| & ( ) < > 공백 탭 개행

이것은 확장 전, 분사 전(확장 후)입니다.
이는 IFS 값에 관계없이 발생합니다.

쉼표는 메타 문자가 아니므로 (처음에는) 줄이 분할되지 않습니다.

관련 정보