echo의 출력이 다른 이유는 무엇입니까?

echo의 출력이 다른 이유는 무엇입니까?

Ubuntu 20.04에서 Bash 5.0.17을 사용하고 있습니다.

후속작입니다이 문제. 질문하기 전에는 IFS그것이 어떻게 작동하는지 이해했다고 생각했지만 지금은 완전히 혼란스럽고 일련의 질문이 있습니다.

  1. 정적 문자열은 무엇을 의미합니까?
  2. 세분화와 확장의 차이점은 무엇입니까?
  3. 이 사이트 어딘가에서 변수 (*) 를 인용하는 것이 권장된다는 내용을 읽었 지만 때로는 다른 결과를 얻습니다. 예를 들면 다음과 같습니다.
IFS=":"; for i in 1:2:3; do echo $i; done # output: 1 2 3
IFS=":"; for i in 1:2:3; do echo "$i"; done # output: 1:2:3

# Why do the quotes make a difference between the two commands?

이러한 질문이 어리석다고 생각된다면 무시하십시오. 이 혼란을 해결하는 데 관심이 있는 사람이 있다면 그 사람의 도움에 정말 감사하겠습니다.

감사해요

편집하다: 아래 링크를 추가했습니다


(*) : 나는 다음 두 가지 답변을 언급하고 있습니다.

답변1

귀하의 for-loop는 귀하가 생각하는 대로 작동하지 않습니다.

IFS=":"; for i in 1:2:3; do ...

$i말 그대로 1:2:3루프는 한 번만 실행됩니다.

IFS변수 확장을 사용하거나 명령의 특수 변수를 사용하여 단어를 분할하십시오 read.

이는 귀하의 질문에 대한 답변이기도 합니다.

를 실행하면 IFS=:; i=1:2:3; echo $i;확장(및 단어 분할)은 마지막 명령에서만 발생하고 "단어"(1, 2, 3)는 별도로 에코됩니다 --> 1 2 3. (@ikkachu가 이미 그의 답변에서 말했듯이 이것이 echo작동하는 방식입니다).
따옴표를 추가하면 $i단어 분리가 방지되고 echo변수가 문자 그대로 출력됩니다( 1:2:3).


for이 지식을 사용하여 변수 확장을 통해 루프를 수정할 수도 있습니다.

IFS=:; var=1:2:3; for i in $var; do echo $i; done

다음을 출력합니다:

1
2
3

답변2

내 질문에 대한 답을 찾은 것 같습니다. (마지막 두 질문에 대한 답변은 다음과 같습니다.웹 페이지).

1. 정적 문자열이란 무엇입니까?

정확한 표현은 아닙니다. 그러나 나는 그것이 "문자 그대로" 문자열을 의미한다고 생각합니다.

2. 확장과 세분화의 차이점은 무엇입니까?

$확장은 중괄호 확장, 물결표 확장, 셸 매개변수 및 변수 확장( 기호 사용 포함), 명령 대체, 산술 확장, 프로시저 대체를 의미합니다 .분사및 파일 이름 확장자.

따라서 단어 분할은 위의 웹 페이지를 인용하여 확장의 특별한 경우입니다.

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

쉘은 $IFS의 각 문자를 구분 기호로 처리하고 다른 확장 결과를 이러한 문자의 단어로 분할합니다. IFS가 설정되지 않았거나 해당 값이 기본값 "''"인 경우 IFS 문자 시퀀스를 사용하여 단어를 구분할 수 있습니다. IFS 값이 기본값이 아닌 경우 공백 문자가 IFS 값 내에 있는 한 단어의 시작과 끝 부분에 있는 공백 문자의 "공백" 및 "탭" 시퀀스는 무시됩니다(IFS 공백 기능). . IFS 공백이 아닌 IFS의 모든 문자와 인접한 IF 공백 문자가 함께 필드를 구분합니다. 공백 문자의 IFS 시퀀스도 구분 기호로 간주됩니다. IFS 값이 비어 있으면 단어 분할이 발생하지 않습니다.

명시적으로 비어 있는 매개변수("""" 또는 "''")는 유지됩니다. 값이 없는 매개변수 확장으로 인해 암시적으로 인용되지 않은 null 매개변수는 제거됩니다. 값이 없는 매개변수를 큰따옴표로 확장하면 빈 매개변수가 생성되고 유지됩니다.

하지만 기억해야 할 중요한 점은 다음과 같습니다.

관련 정보