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

sh 와 bash 는 서로 다른 쉘 입니다. 첫 번째 경우에는 스크립트를 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-alternatives이 justinconover.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.