bash (또는 다른 쉘) 스크립트에서 공백의 수가 중요한 경우는 무엇입니까?


14

나는 공백이 bash다른 쉘 스크립트 에서 중요하다는 말을 들었으며, 내가하고있는 일을 알지 못하면 공백의 존재를 변경해서는 안됩니다. "존재 변경"은 공백이 아닌 두 문자 사이에 공백을 삽입하거나 공백이 아닌 두 문자 사이에 공백을 제거하는 것을 의미합니다 (예 : var="$val"var ="$val"또는 그 반대로 변경) . 물어보고 싶어

쉘 스크립트에서 단일 공백을 사용하거나 연속 된 여러 공백을 사용하는 경우에 차이가 있습니까? .

(물론, 삽입은 / 따옴표로 공간을 삭제하면에서 변경과 같은 차이가 echo "a b"echo "a b"또는 반대로 그. 나는이 사소한 예 이외의 예를 찾고 있어요.)

나는 이 질문에 직면 했지만 그 중 하나는 공백이 아닌 두 문자 사이에 공백을 추가하고 제거하는 것입니다.

도움을 주시면 감사하겠습니다. 가능하면 더 많은 종류의 껍질을 포함하십시오.

답변:


19

따옴표 이외의 쉘은 공백 / 탭, 줄 바꿈, 캐리지 리턴 등을 단어 / 토큰 구분 기호로 사용합니다. 그것의 의미는:

  • 공백으로 분리되지 않은 것은 하나의 "단어" 로 간주됩니다 .
  • 하나 이상의 공백 문자로 분리 된 것은 두 개 이상의 단어로 간주됩니다.

각 "사물"사이의 실제 공백 문자 수는 하나 이상 있으면 문제가되지 않습니다.


감사합니다. 나는 어떤 반대의 예도 찾을 수 없다. 나는 단지 확인하고 싶다.
Weijun Zhou

2
Bash는 또한 양식 공급 및 수직 탭을 공백으로 간주합니다.
fpmurphy

진실. 나는 원래 '... 줄 바꾸기 등'을 쓴 다음 캐리지 리턴을 명시 적으로 추가하도록 변경했습니다. 실수로 'etc'를 떨어 뜨 렸습니다.
cas

공간 수가 너무 많아 프로그램이 메모리에 맞지 않으면 어떻게됩니까?
Worse_Username

7
@Worse_Username 공백은 메모리에 맞지 않아도됩니다. 8GB의 RAM과 20GB의 스왑이있는 컴퓨터에서 48GB 스크립트를 만들었습니다. 잘 돌아갔다. 해당 공백을 모두 처리하는 데 3 분이 걸렸지 만 결국 echo명령과 인수 사이에 공백이 많은 명령을 성공적으로 실행했습니다 .
kasperd

23

이것은 아마도 부정 행위이지만, 이것은 :

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'"

그들은 동일하게 보이지만 !


공백이 인용 부호가 아니지만 백 슬래시는 기능적으로 인용 형식과 유사하며 질문의 "사소한 예"와 같은 범주에 넣습니다. (흥미 롭습니다.)
David Z

12

우리는 공백 문자 (에 대해 얘기하지 않는 경우 U+0020), 그러나 어떤 공백 문자 ( U+0020, \n, \t여기-문서 : 등), 그 다음 하나의 특별한 경우는 내 마음에 와서.

이 코드 (공백 사용) :

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

인쇄합니다 :

  foo

그러나이 코드 (탭 사용) :

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

인쇄합니다 :

foo

그 이유는 ( POSIX 상태 ) :

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


1
그것 참 흥미 롭네. 나는 여기 문서에 대해 생각했지만 <<-연산자를 몰랐습니다 . 대단히 감사합니다.
Weijun Zhou

여기 문서는 쉘 코드가 아닌 인용 텍스트 형태입니다. 쉘 단어 분리는 적용되지 않습니다.
cas

2

할당 문을 작성할 때도 영향을줍니다. 내가 value FOO=xyz이라는 환경 변수를 만들 것이라고 말하지만 , 등호를 공백으로 분리 하면 arg 라는 이름의 프로그램을 호출한다고 생각합니다 . 따라서 특정 구문에 관해서는 중요합니다.FOOxyzFOO=xyz


일반적으로 FOO=xyz내부 쉘 변수는 작성하지만 환경 변수는 작성하지 않습니다. 당신이 필요로 set -a하거나 export FOO=xyz그것을 위해 (즉, 비 서브 쉘 서브 프로세스 환경의 일부로 만들기).
Hauke ​​Laging
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.