>  기사  >  php教程  >  쉘 프로그래밍: Bash Space Things

쉘 프로그래밍: Bash Space Things

高洛峰
高洛峰원래의
2016-11-23 12:57:281193검색

먼저 Bash에서 공백을 사용해야 하는 경우와 사용하지 않는 경우를 이해하세요.

1. 등호 할당에는 양쪽에 공백이 있으면 안 됩니다.

2. 명령과 옵션 사이에는 공백이 필요합니다.

3. 선택사항

자주 발생하는 문제 살펴보기

1. 할당할 때 등호 양쪽에 공백이 있거나 왼쪽에만 공백이 있습니다
test@pythontab. com ~ $ var1 = 테스트
bash: var1: 명령을 찾을 수 없음
test@pythontab.com ~ $ echo ${var1:?error}
bash: var1: 오류
test@pythontab.com ~ $ echo ${var1?error}
bash: var1: 오류
test@pythontab.com ~ $ var2 =test
bash: var2: 명령을 찾을 수 없음
test@pythontab.com ~ $ echo ${var2:?error}
bash: var2: error
test@pythontab.com ~ $ echo ${var2?error}
bash: var2: error

여기서 사용했습니다 bash 변수 확장, ${var1:?error} var1이 설정되지 않거나 null(정의되지 않거나 비어 있음)인 경우 지정된 오류가 보고됩니다. ${var1?error}var1이 설정되지 않은 경우 지정된 오류가 보고됩니다. 실행 결과로 볼 때 등호 왼쪽에 공백이 있으면 변수 이름이 명령으로 실행되어 결과는 명령을 찾을 수 없으며 변수에 값이 할당되지 않았습니다

2. 값을 지정할 때 등호 왼쪽에는 공백이 없고 오른쪽에는 공백이 있습니다. (이 상황은 조금 특별합니다. 두 가지 상황이 있습니다.)
test@pythontab .com ~ $ var= test
test@pythontab.com ~ $ var= nocmd
bash: nocmd: command notfound

등호 오른쪽에도 공백이 있습니다. 첫 번째 명령은 오류를 보고하지 않지만 두 번째 명령은 오류를 보고합니다.

쉘에서 명령을 실행하는 방법이 있기 때문입니다: var=string command

명령 명령은 변수 var의 값을 가져옵니다( var 변수는 명령이 실행된 후 유지됩니다. bash4에서는 유지되지 않지만 대시에서 찾았을 때 유지되었습니다. 테스트는 명령이고 nocmd는 그렇지 않기 때문에 보고했습니다. 명령을 찾을 수 없습니다.
test@ pythontab.com ~ $ var=newtest eval echo $var
newtest
test@pythontab.com ~ $ echo $var

참고: 여기서는 eval을 사용했습니다. 첫 번째 오류를 방지하기 위해 구문 분석 시 $var가 빈 문자열로 대체됩니다. 그렇지 않으면 다음과 같은 상황이 발생합니다(다음은 잘못된 테스트 방법입니다. echo가 실행되기 전에 $var가 빈 문자열로 대체되었습니다)

코드는 다음과 같습니다.
test@pythontab.com ~ $ var=newtest echo $var
test@pythontab.com ~ $ echo $var

이쯤 되면 다들 이해하셨으리라 믿습니다. 등호의 경우 값을 지정할 때 왼쪽과 오른쪽에 공백이 있으면 안 됩니다. 오른쪽에 공백이 있으면 반드시 오류가 발생하는 것은 아니지만 원하는 결과는 아닙니다.

3. 명령어와 옵션 사이에 공백이 있어야 합니다

다들 이해하시는 것 같은데 왜 아직도 장황할까요? 얘기가 나와서 말인데, 매우 특별한 명령을 언급해야 합니다: [ 명령(맞게 읽으셨군요. [ )입니다. 이것은 테스트 명령입니다(물론 bash에서 이것은 내장 명령이지만 영향을 미치지 않습니다).

우리의 이해). 아마 여러분은 [명령이 친숙해 보인다고 생각할 것입니다. 예, 여러분도 본 적이 있을 것입니다. 다음 예제를 살펴보세요
test@pythontab.com ~ $ if [ "abc" = "abc" ]; '그들은 동일합니다'; fi
그들은 동일합니다
test@pythontab.com ~ $ type -a [
[는 쉘 내장입니다
[는 /usr/bin/[

기억하시나요? [명령어는 if 판단에 자주 사용됩니다. 물론 어떤 사람들은
test@pythontab.com ~ $ [ "abc" = "cba" ] || echo 'they are not the same'
그들은 동일하지 않습니다
test@pythontab.com ~ $ type -a [
[ 내장 쉘입니다
[ is /usr/bin/[

[ 이 명령은 호출됩니다. 테스트 명령, 둘 다 거의 동일합니다. 정확히 동일하지 않은 이유는 무엇입니까? 이것을 살펴보겠습니다
test@pythontab.com ~ $ [ "abc" = "cba"
bash: [: 누락 `]'
test@pythontab.com ~ $ [ "abc" = "cba " ]
test@pythontab.com ~ $ test "abc" = "cba" ]
bash: 테스트: 인수가 너무 많습니다
test@pythontab.com ~ $ test "abc" = "cba "

분명히 말씀드리자면 [명령어를 사용할 때는 tail을 주어야 합니다.], test 명령을 사용할 때는 tail을 추가할 수 없습니다. Tail]은 [마지막 매개변수,

명령의 끝을 나타내는 필수 매개변수입니다. 모두가 이해할 수 있도록 먼저 다음과 같이 말씀드리겠습니다. [이것은 쉘에 있는 명령이고 주위에 공백이 있어야 합니다! ]는 [의 마지막 필수 매개변수이며 양쪽에 공백이 필요합니다(ps와 같은 일부 명령의 매개변수는 함께 연결할 수 있지만 [ 명령은 연결할 수 없으므로 매개변수 사이에 공백이 있어야 합니다). [일반적인 실수

를 살펴보겠습니다. a. if와 [
test@pythontab.com ~ $ if[ "$HOME" = "/home/igi"];then echo ' 사이에 공백이 없습니다. 동등'; fi
bash: 예상치 못한 토큰 `then'
test@pythontab.com 근처에 구문 오류가 있습니다. ~ $ if[ "$HOME" = "/home/igi" ];then echo 'equal'; 🎜>bash: 예상치 못한 토큰 `then'
test@pythontab.com 근처에 구문 오류가 있습니다. ~ $ if["$HOME" = "/home/igi"];then echo 'equal'; bash: 구문 예상치 못한 토큰 `then'
test@pythontab.com ~ $ if["$HOME" = "/home/igi" ];then echo 'equal'; bash: 예상치 못한 토큰 근처에서 구문 오류 ` 그럼'

분명히 구문 분석 오류입니다. if[ bash의 경우 도대체 무엇인지 모르겠습니다

b. [와 다음 매개변수
test@pythontab.com ~ $ 사이에 공백이 부족합니다. if [" $HOME" = "/home/igi" ];then echo 'equal'; fi
bash: [/home/igi: 해당 파일이나 디렉터리가 없습니다
test@pythontab.com ~ $ if [ "$HOME " = "/home/igi"];then echo 'equal'; fi
bash: [/home/igi: 해당 파일이나 디렉터리가 없습니다

["$HOME" bash의 경우, 그리고 도대체 무슨 일이 일어나고 있는지 모르겠습니다

c. [ ]
test@pythontab.com ~ $ if [ "abc"="abc" 사이의 매개변수 사이에 공백이 부족합니다. ]; then echo 'equal' ; fi
equal
test@pythontab.com ~ $ if [ "abc"="cba" ] then echo 'equal'; >첫 번째 명령어는 맞는 것 같네요(사실 그냥 우연일 뿐입니다), 두 번째 명령어를 보면 "abc"와 "cba"는 분명히 다르지만 같은 것으로 판단됩니다. 이는 매개변수 사이의 공백이 부족하고, [명령어는 내부 값을 단순한 값으로 간주하기 때문입니다. 다음 명령을 살펴보면 안심할 수 있습니다
test@pythontab.com ~ $ if [ 0 ] then echo 'equal'; fi
equal
test@pythontab.com ~ $ if [ "1 " ]; echo 'equal'; fi
equal
test@pythontab.com ~ $ if [ "" ]; then echo 'equal'; test@pythontab.com ~ $ if [ ] ; then echo 'equal'; fi

[ ]에 값이 하나만 있는 경우(공백이 부족하여 함께 연결된 것도 포함) 빈 문자열이 아닌 경우 true입니다. . 따라서 [ ] 사이의 매개변수도 양쪽에 공백이 있어야 하며, 겹쳐서 사용할 수 없습니다

d. 매개변수와 꼬리 사이에 공백이 부족합니다.]

장황하지 않습니다. , tail] [명령어의 매개변수이기도 합니다. 위에서 언급했듯이

매개변수 사이에는 공백이 있어야 합니다. . 물론입니다. 행운을 빕니다.
test@pythontab.com ~ $ var=' abc'
test@pythontab.com ~ $ if [$var = "abc" ] ;then echo 'equal'; fi
equal
test@pythontab.com ~ $ if ["$var" = "abc" ];then echo 'equal'; bash: [ abc: 명령 찾을 수 없음

double 따옴표로 묶인 것은 전체를 의미하며, 큰 따옴표가 없는 경우 문자열 전후의 공백이나 탭은 잘립니다. 우연히 마주치거나 의도적으로 문자열 앞뒤에 공백이나 탭을 삭제하려는 경우 불가능하지는 않지만 이를 작성하는 것은 매우 권장되지 않습니다. 코드가 매우 취약해질 수 있습니다.

또는 추가해야 할 공백을 모두 추가했지만 여전히 오류가 발생하는 경우도 큰따옴표가 부족하기 때문일 수 있습니다. 이러한 상황은 매우 일반적입니다. 마지막으로
test@pythontab.com ~ $ var=''
test@pythontab.com ~ $ if [ "$var" = "abc" ];then echo를 살펴보세요. 'equal'; fi
test@pythontab.com ~ $ if [ $var = "abc" ];then echo 'equal';
bash: [: =: 단항 연산자 필요
test@pythontab .com ~ $ dvar='a b c'
test@pythontab.com ~ $ if [ $dvar = "a b c" ];then echo 'equal'; fi
bash: [: 인수가 너무 많습니다
test@ pythontab.com ~ $ if [ "$dvar" = "a b c" ];then echo 'equal'; fi
equal

자세히 설명하겠습니다. 큰따옴표를 생략하지 마세요. 쉽게. 분명합니까? 그래도 이해가 안 되시면

마지막으로 파이프 양쪽의 선택 공백에 대해 헛소리는 하지 않겠습니다. 이에 대해 의심하는 사람을 본 적이 없기 때문입니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.