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