Program Tip

Bash의 'if'문에서 두 문자열 변수를 어떻게 비교합니까?

programtip 2020. 10. 3. 11:35
반응형

Bash의 'if'문에서 두 문자열 변수를 어떻게 비교합니까? [복제]


이 질문에 이미 답변이 있습니다.

Bashif 에서 작동 하도록 성명 을 얻으려고합니다 ( Ubuntu 사용 ).

#!/bin/bash

s1="hi"
s2="hi"

if ["$s1" == "$s2"]
then
  echo match
fi

나는 다양한 형태의 시도했습니다 if사용하여 문을 [["$s1" == "$s2"]]사용하여 따옴표없이 =, ==그리고 -eq,하지만, 난 여전히 다음과 같은 오류가 발생합니다 :

[hi : 명령을 찾을 수 없음

여러 사이트와 튜토리얼을 살펴보고 복사했지만 작동하지 않습니다. 내가 뭘 잘못하고 있습니까?

결국 $s1에는이 포함 $s2되어 있는지 말하고 싶습니다. 어떻게해야합니까?

방금 공백 비트를 계산했습니다. : / 어떻게 포함한다고 말합니까?

나는 시도했다

if [[ "$s1" == "*$s2*" ]]

하지만 작동하지 않았습니다.


문자열 비교를 위해 다음을 사용하십시오.

if [ "$s1" == "$s2" ]

찾는 a포함 b, 사용 :

if [[ $s1 == *"$s2"* ]]

(심볼 사이에 공백을 추가해야합니다) :

나쁜:

if ["$s1" == "$s2"]

좋은:

if [ "$s1" == "$s2" ]

공백이 필요합니다.

if [ "$s1" == "$s2" ]

변수에 다음이 포함 된 경우 '['기호와 큰 따옴표 사이에 공백을 두도록주의해야합니다.

if [ "$s1" == "$s2" ]; then
#   ^     ^  ^     ^
   echo match
fi

^의 당신이 떠날 필요가 빈 공간을 보여줍니다.


나는 이것을 제안한다 :

if [ "$a" = "$b" ]

여는 / 닫는 대괄호와 변수 사이의 공백과 '='기호를 감싸는 공백을 확인하십시오.

또한 스크립트 헤더에주의하십시오. 당신이 사용하든 같은 것이 아닙니다

#!/bin/bash

또는

#!/bin/sh

여기에 소스가 있습니다.


내가 제안 할게:

#!/bin/bash

s1="hi"
s2="hi"

if [ $s1 = $s2 ]
then
  echo match
fi

큰 따옴표없이 하나만 같음.


Bash4 + 예제. 참고 : 따옴표를 사용하지 않으면 단어에 공백 등이 포함 된 경우 문제가 발생합니다. 항상 bash IMO에서 따옴표를 사용합니다.

다음은 BASH4 +의 몇 가지 예입니다.

Example 1, check for 'yes' in string (case insensitive):

if [[ "${str,,}" == *"yes"* ]] ;then

Example 2, check for 'yes' in string (case insensitive):

if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then

Example 3, check for 'yes' in string (case sensitive) :

 if [[ "${str}" == *"yes"* ]] ;then

Example 4, check for 'yes' in string (case sensitive):

 if [[ "${str}" =~ "yes" ]] ;then

Example 5, exact match (case sensitive):

 if [[ "${str}" == "yes" ]] ;then

Example 6, exact match (case insensitive):

 if [[ "${str,,}" == "yes" ]] ;then

Example 7, exact match :

 if [ "$a" = "$b" ] ;then

This question has already great answers but here it appears that there is a slight confusion between using single equal and double equals in

if [ "$s1" == "$s2" ]

The main difference lies in which scripting language are you using. If you are using bash then include #!/bin/bash in the starting of the script and save your script as filename.bash. To execute use bash filename.bash - then you have to use ==.

If you are using sh then use #!/bin/sh and save your script as filename.sh. To execute use sh filename.sh - then you have to use single =. Avoid intermixing them.


$ if [ "$s1" == "$s2" ]; then echo match; fi
match
$ test "s1" = "s2" ;echo match
match
$

I don't have access to a linux box right now, but [ is actually a program (and a bash builtin), so I think you have to put a space between [ and the first parameter.

Also note that string equality operator seems to be a single =


This is more clarification than answer ! Yes , the clue is in the error message:

[hi: command not found

which shows you that your "hi" has been concatenated to the "[".

Unlike in more traditional programming languages, in Bash, "[" is a command just like the more obvious "ls" etc. - it's not treated specially just because it's a symbol, hence the "[" and the (substituted) "$s1" which are immediately next to each other in your question, are joined (as is correct for Bash) and it then tries to find a command in that position: [hi - which is unknown to Bash.

In C and some other languages, the "[" would be seen as a different "character class" and would be disjoint from the following "hi".

Hence you require a space after the opening "[".


#!/bin/bash

s1="hi"
s2="hi"

if [ "x$s1" == "x$s2" ]
then
  echo match
fi

Adding additional string inside makes it more safe.

You could also use other notation for single line commands:

[ "x$s1" == "x$s2" ] && echo match

For a version with pure Bash and without test, but really ugly, try:

if ( exit "${s1/*$s2*/0}" )2>/dev/null
then
   echo match
fi

Explanation: In ( )an extra subshell is opened. It exits with 0 if there was a match, and it tries to exit with $s1 if there was no match which raises an error (ugly). This error is directed to /dev/null.

참고URL : https://stackoverflow.com/questions/4277665/how-do-i-compare-two-string-variables-in-an-if-statement-in-bash

반응형