어떤 경우에는 bash(또는 다른 쉘) 스크립트에서 공백 수가 중요합니다.

어떤 경우에는 bash(또는 다른 쉘) 스크립트에서 공백 수가 중요합니다.

bash나는 다른 쉘 스크립트에서는 공백이 중요하며 내가 무엇을 하고 있는지 알지 않는 한 공백의 존재를 변경해서는 안 된다는 말을 들었습니다 . "변경 사항 var="$val"이 존재합니다"란 공백이 아닌 두 문자 사이에 공백을 삽입하거나 공백이 아닌 두 문자 사이에서 공백을 제거하는 것을 의미합니다 var ="$val". 나는 묻고 싶다

쉘 스크립트에서 단일 공백 ​​또는 여러 개의 연속 공백을 사용하면 차이가 있습니까?.

(물론 따옴표 안에 공백을 삽입/제거하면 차이가 생길 수 있습니다. 예를 들어 에서 로 echo "a b"또는 echo "a b"그 반대로 변경하는 것입니다. 이 간단한 예가 아닌 다른 예를 찾고 있습니다.)

내가 만난이 문제그러나 이는 공백이 아닌 두 문자 사이에 공백을 추가하고 제거하는 것에 관한 것이며 이것이 영향을 미칠 수 있는 많은 예를 알고 있습니다.

어떤 도움이라도 대단히 감사하겠습니다. 가능하다면 더 다양한 껍질을 포함하세요.

답변1

이는 부정행위일 수 있지만 다음과 같습니다.

rm foo\ bar         # "delete the file named 'foo bar'"

이와 달리:

rm foo\  bar        # "delete the files named 'foo ' and 'bar'"

공간이 있어도아니요따옴표로 묶었습니다. ;-)

더욱 혼란스러운 점은 다음과 같습니다.

rm \
    foo          # "delete the file named 'foo'"

이와 달리:

rm \ 
    foo          # "delete the file named ' ', then run the command 'foo'"

비록 그들이바라보다똑같습니다!

답변2

따옴표 밖에서 쉘은 공백(공백, 탭, 개행, 캐리지 리턴 등)을 단어/토큰 구분 기호로 사용합니다. 이는 다음을 의미합니다.

  • 공백으로 구분되지 않은 항목이 고려됩니다.하나"단어".
  • 하나 이상의 공백 문자로 구분된 항목은 두 개 이상의 단어로 처리됩니다.

각 "사물" 사이에 공백 문자가 하나라도 있으면 실제 개수는 중요하지 않습니다.

답변3

공백 문자( )를 말하는 것이 아니라 U+0020,어느공백 문자( U+0020, 등) \n\t사용한 다음 특별한 경우인 Here-Documents를 생각했습니다.

이 코드(공백 사용):

cat <<- 'EOF'
<space><space>foo
EOF

다음을 인쇄합니다:

  foo

하지만 이 코드는 (탭 사용):

cat <<- 'EOF'
<tab><tab>foo
EOF

다음을 인쇄합니다:

foo

그 이유는(POSIX가 말했듯이):

리디렉션 연산자가 인 경우 <<-입력 행과 후행 구분 기호가 포함된 행에서 모든 선행 <tab> 문자를 제거해야 합니다.

답변4

나는 "공간"의 좋은 예를 발견했고 그것을 여기서 공유하고 싶었습니다. 다음 조건은 100과 1000 사이의 i에 대해 true로 평가되지 않습니다.

if [ $i -ge 100 -a $i -lt 1000]; then  <some code here>  fi

1000과 닫는 괄호 사이에 공백이 없습니다.

그러나 아래 설명과 같이 변경하면 예상대로 작동합니다.

>  if [ $i -ge 100 -a $i -lt 1000 ]; then  <some code here>  fi

관련 정보