bash의 문자열 비교. [[: 찾을 수 없음


165

bash에서 문자열을 비교하려고합니다. 이미 stackoverflow 에서 수행하는 방법에 대한 답변을 찾았습니다 . 내가 시도하는 스크립트에서 언급 한 질문에 Adam이 제출 한 코드를 사용하고 있습니다.

#!/bin/bash
string='My string';

if [[ "$string" == *My* ]]
then
  echo "It's there!";
fi

needle='y s'
if [[ "$string" == *"$needle"* ]]; then
  echo "haystack '$string' contains needle '$needle'"
fi

나는 또한 두 번째 게시물에서 찾을 수있는 우분투 포럼의 접근법을 시도 했습니다.

if [[ $var =~ regexp ]]; then
  #do something
fi

두 경우 모두 오류가 발생합니다.

[[: not found

내가 뭘 잘못하고 있죠?


내가 잘못했을 수도 있지만 단일 대괄호를 사용하면 항상 효과적입니다.
Markus Unterwaditzer

1
무엇을 /bin/bash --version인쇄합니까?
themel

4
[이 경우 패턴을 지원하지 않기 때문에 작동하지 않습니다.
Ansgar Wiechers

답변:


157

[[bash 내장입니다. 당신 /bin/bash은 실제 배쉬가 아닌 것 같습니다.

의견에서 :

#!/bin/bash파일 맨 위에 추가


내가 입력하면 : '[['을 입력하십시오. [[는 쉘 키워드입니다
user1581900

5
달릴 때도 같은 결과가 나옵니까 /bin/bash -c "type [["?
Ansgar Wiechers

43
#!/bin/bash파일 상단에 추가하는 것을 잊었 기 때문에 이런 일이 일어났습니다
morphatic

12
내가 스크립트를 실행했기 때문에 나에게 일어난다 sh. 이제이 답변을 찾기 전에 내가 원하지 않는 모든 것을 다시 실행해야합니다.
Louis Loudog Trottier

174

스크립트를 어떻게 실행하고 있습니까? 당신이 함께했다면

$ sh myscript

당신은 시도해야합니다 :

$ bash myscript

또는 스크립트가 실행 가능한 경우 :

$ ./myscript

shbash 는 서로 다른 쉘 입니다. 첫 번째 경우에는 스크립트를 sh 인터프리터에 대한 인수로 전달하는 반면 두 번째 경우 첫 번째 행에서 사용할 인터프리터를 결정합니다.


이런 식으로 권한이 거부되었습니다. 그 명령 ./myscript sudo를 찾을 수 없습니다
user1581900

11
않는 chmod를 + X로 myscripf을 , 다시 실행, 당신은 sudo는 필요하지 않습니다
아 코스 K

2
스크립트를 어떻게 호출합니까?
Akos K

네가 말했듯이. 일반적으로 '$ sh myscipt.sh'로 호출합니다. chmod를 수행 한 후 2 시간 + X 내가 ./myscript.sh로 불리는 myscript.sh
user1581900

5
당신은을 통해 스크립트를 실행할 때 오류가 예상되고 sh myscript.sh있기 때문에, /bin/sh하는 본 쉘 어디 에뮬레이트 [[내장 명령이 아닙니다. 그러나이 ./script.sh경우 shebang을 사용해야하므로 스크립트를 통해 스크립트를 실행하면 오류가 발생하지 않습니다 /bin/bash.
Ansgar Wiechers

81

스크립트의 첫 번째 줄입니다.

#!/bin/bash

또는

#!/bin/sh

sh 쉘은 bash가 아닌이 오류 메시지를 생성합니다.


1
저자가 언급 한 오류가 발생하여 첫 번째 줄도 누락되었습니다!
Anonymous

14

Heroku Toolbelt를 설치할 때이 문제가 발생했습니다

이것이 내가 문제를 해결 한 방법입니다

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 ago 15  2012 /bin/sh -> dash

보다시피, / bin / sh는 "대시"(bash가 아닌)에 대한 링크이며, [[bash 구문 설탕이다. 그래서 방금 / bin / bash에 대한 링크를 교체했습니다. 시스템에서 rm과 같이 조심해서 사용하십시오!

$ sudo rm /bin/sh
$ sudo ln -s /bin/bash /bin/sh

6
sh배포판 의 기본값 을 재정의하는 것은 좋지 않은 IMHO입니다. 함께 실행되는 쉘은 다음과 함께 sh작동해야합니다 dash. 그렇지 않은 경우 스크립트의 버그입니다. 당신이 필요로하는 경우 bash기능을 사용 bash하지 sh.
tripleee

4
이 끔찍한 tbh 소리
MrVaykadji

2
나는 그것이 추악한 해결책 일 뿐이라는 데 동의합니다. 비슷하지만 더 나은 해결 방법은 update-alternativesjustinconover.wordpress.com/2012/05/14/… 와 같은 (데비안 기반 리눅스에서) 사용하는 것이지만 결국에는 동일합니다.
jperelli

13

@Ansgar가 언급했듯이 bashism [[은 Bash에 내장되어 있으며 다른 쉘에서는 사용할 수 없습니다. 스크립트를 이식 가능하게하려면을 사용하십시오 [. 비교에는 다른 구문이 필요합니다 :로 변경 ==하십시오 =.


Ubuntu 16.04 및 (sh->) 대시 0.5.8-2.1ubuntu2로 비트를 확인하고 "-eq"및 유사 항목과 함께 잘 작동 함을 발견했습니다. 이 문맥 비교 연산자에 대한 유사한 정보는 여기에서 찾을 수 있습니다 : stackoverflow.com/questions/10849297/... - 다음 링크에서 권장하지만 내 최소 침습적 변경 실패 할 듯 나는이 더 (()) 평가 연산자 cheked / 또는 훨씬 더 깊은 수준의 코드 변경이 필요합니다. softpanorama.org/Scripting/Shellorama/Control_structures/…
Alexander

3

스크립트를 실행할 때 sh 대신 bash를 지정하십시오. 나는 개인적으로 우분투 12.10에서 다르다는 것을 알았습니다.

bash script.sh arg0 ... argn


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