문제

간단한 쉘 스크립트에서 두 문자열을 비교하려고 합니다.나는 사용하고 있었다 /bin/sh 대신에 /bin/bash, 수많은 디버깅 시간 후에 sh(실제로는 대시)가 이 코드 블록을 처리할 수 없다는 것이 밝혀졌습니다.

if [ "$var" == "string" ]
then
    do something
fi

다음을 사용하여 문자열을 비교하는 이식 가능한 방법은 무엇입니까? /bin/sh?!=를 사용하여 항상 반대 작업을 수행할 수 있다는 것을 알고 있지만 더 깨끗하고 이식 가능한 방법이 궁금합니다.

도움이 되었습니까?

해결책

dash 매우 엄격한 POSIX 쉘입니다. dash 다른 POSIX 셸에서도 작동할 것이 거의 확실합니다.

노력하다:

if [ "$var" = "string" ]
then
    some_command
fi

다른 팁

스크립트가 "잘못된" 쉘에 의해 실행될 가능성이 있는 이유는 무엇입니까?스크립트 상단에 있는 표준 sh-bang 라인을 사용하여 이를 제품의 전제 조건으로 만들 수 있다고 생각합니다.

#!/bin/bash

사용자라 할지라도 용도 다른 쉘이 있으면 다른 쉘은 일반적으로 여전히 존재하며, 그렇지 않은 경우 단순히 불평하고 사전 요구 사항이라고 명시합니다.

특정 커널 레벨이나 awk의 존재가 사전 요구사항이 될 수 있는 것과 정확히 같은 방식입니다.

귀하의 구체적인 질문에 대해서는 두 가지 모두를 믿습니다. sh 그리고 bash 문자열 비교에 단일 '=' 사용을 허용합니다. 이는 POSIX 동작입니다.

if [ "a" = "a" ] ; then
    echo yes
fi

yes

사용 = 대신에 ==.비교는 test(1)에 의해 처리됩니다. /usr/bin/[ 일반적으로 링크는 다음과 같습니다. /usr/bin/test .유일한 차이점은 사용한다면 [ 쉘 스크립트에서는 ] 필요합니다.

bash에는 내장되어 있습니다. test/[, 이므로 실제로는 사용되지 않습니다. /usr/bin/test.

이미 게시된 답변은 확실히 정확하지만 때로는 매개변수 확장이 약간의 유연성을 추가하여 동일한 목적을 수행할 수 있다는 점에 유의할 가치가 있습니다.

% p() { printf 'notvar = %b\n' "${notvar##"${string1}"}${string2}" ; }
% string1='some stuff about things\c'
% string2='some different stuff maybe'
% notvar="$string1" p
> 'some different stuff maybe'
% notvar="$string2" p
> 'some stuff about things'

좋아, 위의 내용은 있는 그대로 매우 유용하지는 않지만 여기 문서의 변수를 테스트하거나 필요한 경우 인라인 변수 할당(어느 정도...) 또는 심지어 유사한 방법을 사용할 수 있다는 점도 고려하십시오. 첫 번째 문장을 작성하는 더 짧고 빠른 방법과 같습니다.

[ ! "${var##"string"}" ] && _MATCH || _NOMATCH

또는...

[ ${#var#*"${s=string}"} -lt ${#var} ] && _SUB_STRING_TEST=TRUE

아마도...

% p() { printf '%s is %s of %s' "$2" "${var_chk-not}" "$1"
> }<<HEREDOC
> ${in="${1##*"${2}"*}"}
> ${in:-
>     ${in="${1##"${2}"}"}
>     ${in:-${var_chk=all}
>     ${var_chk=some}
> }
> HEREDOC
%

당신은 awk를 사용할 수 있습니다

awk 'BEGIN{
 string1="test"
 string2="tes1t"
 if(s1==s2){
    print "same string"
 }else{
    print "not same"
 }
}'
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top