Bash 변수 할당에서 명령을 찾을 수 없음 오류


520

test.sh라는 스크립트가 있습니다.

#!/bin/bash
STR = "Hello World"
echo $STR

내가 실행할 때 나는 sh test.sh이것을 얻는다 :

test.sh: line 2: STR: command not found

내가 무엇을 잘못하고 있지? 나는 매우 기초적인 / 초보자 bash 스크립팅 튜토리얼을 온라인에서 봤는데 이것이 변수를 선언하는 방법입니다 ... 그래서 내가 뭘 잘못하고 있는지 잘 모르겠습니다.

우분투 서버 9.10에 있습니다. 그리고 bash는에 있습니다 /bin/bash.


49
나는 당신이 질문을했기 때문에 기쁘다. 당신은 유일한 멍청한 놈이 아니다!
고릴라 밀러

6
그 질문을 해주셔서 감사합니다. 이것은 당황스러운 질문이 아닙니다. 나는 늦은 밤 사무실에서 일하고 있으며 주위에 배쉬 전문가가 없습니다.
Adway Lele

3
요즘 (거의 7 년 후!) shellcheck 이라는 FOSS 린터 / 분석기가 있으며이 구문 및 기타 일반적인 구문 문제를 자동 감지합니다. 온라인으로 사용하거나 오프라인으로 설치하여 편집기에 통합 할 수 있습니다.
다른 사람


나는 당신 이이 대답 때문에 당신 이 있는지 확실하지 않은 한 #!/usr/bin/env bash직접 넣는 대신 직접 사용하는 것이 좋습니다 : stackoverflow.com/a/21613044/3589567#!/bin/bashbash/bin
Alejandro Blasco

답변:


928

'='기호 주위에 공백이있을 수 없습니다.

당신이 쓸 때 :

STR = "foo"

bash는 2 개의 인수 (문자열 '='및 'foo')와 함께 STR이라는 명령을 실행하려고합니다.

당신이 쓸 때 :

STR =foo

bash는 1 개의 인수 (문자열 '= foo')와 함께 STR이라는 명령을 실행하려고합니다.

당신이 쓸 때 :

STR= foo

bash는 환경에서 STR을 빈 문자열로 설정하여 foo 명령을 실행하려고 시도합니다.

이것이 명확히하는 데 도움이되는지 또는 단순히 난독 화인지 확실하지 않지만 다음 사항에 유의하십시오.

  1. 첫 번째 명령은 정확히 다음과 같습니다 STR "=" "foo".
  2. 두 번째는와 동일합니다 STR "=foo".
  3. 마지막은와 같습니다 STR="" foo.

sh 언어 사양 의 관련 섹션 , 섹션 2.9.1 에는 다음이 명시되어 있습니다.

"간단한 명령"은 제어 연산자에 의해 종료되는 임의의 순서대로 선택적 변수 할당 및 재지향의 순서이며, 임의의 순서로 단어 및 재지향이 뒤 따릅니다.

이러한 맥락에서 a word는 bash가 실행할 명령입니다. 경로 =재 지정이 아닌 (문자열의 시작이 아닌 다른 위치에있는) 문자열은 변수 지정이며, 경로 재 지정이 아니고 포함되지 않은 문자열 =은 명령입니다. 에서은 STR = "foo", STR변수 할당하지 않습니다.


2
"-"가 포함 된 이름을 가진 변수가 있으면 동일한 오류가 발생합니다. 이 경우 해결책은 "-"
chomp

1
chomp @ pubs.opengroup.org/onlinepubs/9699919799 의 섹션 2.10.10의 7b 규칙에서 " '='앞의 모든 문자가 유효한 이름 (XBD 이름 참조)을 형성하면 ASSIGNMENT_WORD 토큰이 반환됩니다." 섹션 3.231에 링크를 pubs.opengroup.org/onlinepubs/9699919799 것은 , 우리는 쉘 명령 언어에서, 휴대용 문자 세트에서 유일하게 밑줄, 숫자 및 영문자로 구성된 단어. 이름의 첫 번째 문자는 "발견 숫자가 아닙니다. " 따라서 단어 FOO-BAR=quxFOO-BAR유효한 이름 이 아니므로 변수 할당 이 아닙니다.
William Pursell

2
나는 초보자에게 항상 일반적인 문제에 대해이 명확한 설명을 보상하기 위해 현상금을 제공하고 있습니다. 일을 쉽게 해주셔서 감사합니다!
fedorqui 'SO 중지 피해'

1
@fedorqui 감사합니다! 나는 이것이 분명한 설명이라는 것을 전적으로 확신하지는 않으며, 그것이 더 간단해질 수 있는지 종종 궁금합니다.
윌리엄

159

=부호 주위에 공백을 제거 하십시오.

#!/bin/bash 
STR="Hello World" 
echo $STR 

9
그러나 이것은 set foo = barWindows 배치 파일에서 흔히 발생하는 실수와 마찬가지로 재밌 습니다. 배치 언어가 이에 대해 조롱됩니다. ;-)
Joey

감사합니다 @joey. "="뒤에 공백이있는 변수를 초기화하는 쉘 스크립트를 작성하는 데 어려움을 겪었습니다. 당신은 내 하루를 구 했어요
Lalit Rao

왜 bash가 왼쪽 필드에 숫자를 허용하지 않습니까? 3 = "Hello World"와 같이 명령을 찾을 수 없음에 대해 불평합니다
Freedo

6

대화 형 모드에서는 모든 것이 잘 보입니다.

$ str="Hello World"
$ echo $str
Hello World

Johannes가 말했듯이 분명히 (!) 주위에는 공간이 없습니다 =. =대화식 모드에서 주위에 공간이 있으면 다음과 같이 오류가 발생합니다.

'str'명령이 없습니다.


2
그러나 OP가 말하고 있으므로이 STR = "Hello World"답변은 여기에 적용되지 않습니다.
fedorqui 'SO 중지 피해'

@Arkapravo 인터랙티브 모드의 의미는, $마크 와 관련이 있다는 것입니다
Kasun Siyambalapitiya

"대화식 모드"로 @KasunSiyambalapitiya는 스크립트가 아닌 실제 터미널에서 해당 명령을 입력하는 것을 의미합니다.
numbermaniac

5

나는 이것이 매우 고품질의 답변으로 대답되었다는 것을 알고 있습니다. 그러나 간단히 말해서 공백이 없습니다.

#!/bin/bash
STR = "Hello World"
echo $STR

등호 주위의 공백으로 인해 작동하지 않았습니다. 당신이 실행한다면 ...

#!/bin/bash
STR="Hello World"
echo $STR

작동합니다


2

변수를 정의 할 때 추가 공백을 넣을 필요가 없습니다.

예 :

name = "Stack Overflow"  
// it is not valid, you will get an error saying- "Command not found"

따라서 공백을 제거하십시오.

name="Stack Overflow" 

잘 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.