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

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

내가 뭘 잘못하고 있죠?



답변

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

의견에서 :

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


답변

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

$ sh myscript

당신은 시도해야합니다 :

$ bash myscript

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

$ ./myscript

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


답변

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

#!/bin/bash

또는

#!/bin/sh

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


답변

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


답변

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


답변

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

bash script.sh arg0 ... argn


답변