2017-01-19 1 views
3
1 #!/bin/bash 
    2 
    3 declare -r NUM1=5 
    4 NUM2 =4 
    5 
    6 num3=$((NUM1 + NUM2)) 
    7 num4=$((NUM1 - NUM2)) 
    8 num5=$((NUM1 * NUM2)) 
    9 num6=$((NUM1/NUM2)) 
10 
11 echo "$num3" 
12 echo $((5**2)) 
13 echo $((5%4)) 
14 

스피이 bash는 스크립트를 사용하여 스피 동안 내가 변수 할당 사이의 간격이 Bash에서 오류를 발생시키는 이유는 무엇입니까?

./bash_help 
./bash_help: line 4: NUM2: command not found 
./bash_help: line 9: NUM1/NUM2: division by 0 (error token is "NUM2") 
5 
25 
1 

그래서 난이 오류가 사라에 코드를 변경 한 오류를 가지고 스크립트를 실행.

 1 #!/bin/bash 
     2 
     3 declare -r NUM1=5 
     4 NUM2=4 
     5 
     6 num3=$((NUM1 + NUM2)) 
     7 num4=$((NUM1 - NUM2)) 
     8 num5=$((NUM1 * NUM2)) 
     9 num6=$((NUM1/NUM2)) 
    10 
    11 echo "$num3" 
    12 echo $((5**2)) 
    13 echo $((5%4)) 
    14 

왜 우리는 변수 값을 지정하면서 규칙이 날이 구성품을 설명 code.Can 누군가의 가시의 더 나은 이해를위한 공간을 제공하기 때문에 우리는 공간을 제공하지 못할?

어떤 제안이나 설명을 환영합니다 ...

그것은 떠들썩한 파티에서 규칙이 아니다
+1

'bash'의 패러다임 중 하나 일뿐입니다. 질문 할 수 없습니다. – Inian

+2

셸에서 공백은 중요한 구분 기호입니다. 대부분의 경우 명령 줄의 의미를 변경하기 때문에 ** 모양을 더 좋게 만들기 위해 추가하거나 제거 할 수 없습니다 **. –

+0

감사합니다. 작은 문제이지만, 오류는 발생하지 않습니다. –

답변

6

(또는 더 일반적으로, POSIX 가족 껍질).

"왜"에 관해서는, 그것을 잘못하는 다양한 방법들이 모두 유효한 의미를 지니고 있기 때문입니다. NUM2 = 4을 과제로 지정한 경우 =을 인용 부호없이 그대로 전달할 수 없습니다. 결과적으로 이러한 변경은 정의되지 않은 공간 (POSIX sh 표준 확장이 해당 표준을 구성하는 것을 피하기 위해 살아야 함)에 배치되는 것이 아니라 역 호환되지 않음입니다.

NUM2= 4 # runs "4" as a command, with the environment variable NUM2 set to an empty string 
NUM2 =4 # runs "NUM2" as a command, with "=4" as its argument 
NUM2 = 4 # runs "NUM2" as a command, with "=" as its first argument, and "4" as another 
+0

"NUM2 = 4 #"NUM3 "이 실행됩니다 ???? – some

3

bash에서 함수는 공백으로 구분 된 단어로 인수가 전달됩니다. 문서

에서

는 "각 연산자와 피연산자는 별도의 인수 여야합니다."

변수 할당은 다른이며,이 구문 name=[value]

당신이 bash는 명령으로 이것을 해석하는 것 때문에 등호 주위에 인용 부호가없는 공백을 넣을 수없는 이유를 사용합니다.

2

이유는 아주 간단하게 쉘이 이와 같이 작동하도록 제작되었습니다. 다른 프로그래밍 언어 (쉘 구문을 "언어"라고 부르는 경우)에서 경험이있는 사람에게는 의미가 없을 수 있습니다.

쉘 스크립팅을 사용하면 많은 경우 문자열을 인용하지 않을 수 있습니다 (단 하나의 문자열로 된 일련의 문자에 공백이나 특수 문자가 포함되어 있지 않은 한). 이 덕분에, 당신은 쓸 수 있습니다 : 대신 대부분의 언어에서

"my_command" "-n" "-X" "arg1" "arg2" 

(가상의 의사 코드의 일부 종류), 그것은 주변의 다른 방법의

my_command -n -X arg1 arg2 

을 : 리터럴 문자열을 인용, 어떤 쉘 스크립팅에서 $과 같은 특수 문자없이 변수를 사용하기 위해 "구문 공간"을 비 웁니다.

쉘 구문은 빈번한 경우에 편의를 제공합니다. 다른 구문을 수행 할 때 편리함 (그리고 가독성)이 떨어집니다. 저주와 축복입니다. 좋은 점은 대화 형 쉘을 사용하면 일종의 (어쩌면 우아하지 않은) 프로그램을 처리 할 수있는 통역사가 있는지 100 % 확신 할 수 있다는 것입니다.보편적 인 가용성으로 인해 (다양한 맛이 존재 함에도 불구하고) 쉘은 학습 가치가있는 플랫폼의 일종입니다.

관련 문제