development

Bash에서 문자열을 비교하는 방법

big-blog 2020. 9. 28. 09:29
반응형

Bash에서 문자열을 비교하는 방법


변수를 문자열과 어떻게 비교합니까 (일치하는 경우 작업)?


if 문에서 변수 사용

if [ "$x" = "valid" ]; then
  echo "x has the value 'valid'"
fi

당신이 일치하지 않는 무언가를 할 경우, 교체 =와 함께 !=. 문자열 연산산술 연산대한 자세한 내용은 해당 설명서를 참조하십시오.

왜 우리는 주위에 따옴표를 사용 $x합니까?

$x비어 있으면 bash 스크립트에 아래와 같이 구문 오류가 발생하기 때문에 따옴표를 원합니다 .

if [ = "valid" ]; then

비표준 ==연산자 사용

bash수는 ==어떤지에 사용되는 [,하지만 이 표준되지 않습니다 .

따옴표 $x가 선택 사항 인 첫 번째 경우를 사용하십시오 .

if [[ "$x" == "valid" ]]; then

또는 두 번째 경우를 사용하십시오.

if [ "$x" = "valid" ]; then

또는 else 절이 필요하지 않은 경우 :

[ "$x" == "valid" ] && echo "x has the value 'valid'"

a="abc"
b="def"

# Equality Comparison
if [ "$a" == "$b" ]; then
    echo "Strings match"
else
    echo "Strings don't match"
fi

# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
    echo "$a is lexicographically smaller then $b"
elif [ "$a" \> "$b" ]; then
    echo "$b is lexicographically smaller than $a"
else
    echo "Strings are equal"
fi

메모:

  1. 사이의 공백 if[]중요하다
  2. ><리디렉션 연산자이므로 \>\<문자열에 대해 각각 이스케이프하십시오 .

문자열을 와일드 카드와 비교하려면

if [[ "$stringA" == *$stringB* ]]; then
  # Do something here
else
  # Do Something here
fi

한 가지 의견 중 하나에 동의하지 않습니다.

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

아니, 그건 미친 oneliner가 아닙니다

흠, 초심자에게 ...

어떤면에서는 공통 패턴을 언어로 사용합니다.

그리고 언어를 배운 후에.

사실 읽어서 좋네요

이것은 논리 연산자의 지연 평가라는 특별한 부분이있는 간단한 논리 표현식입니다.

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

각 부분은 논리식입니다. 첫 번째는 참 또는 거짓 일 수 있고 다른 두 가지는 항상 참입니다.

(
[ "$x" == "valid" ] 
&&
echo "valid"
)
||
echo "invalid"

Now, when it is evaluated, the first is checked. If it is false, than the second operand of the logic and && after it is not relevant. The first is not true, so it can not be the first and the second be true, anyway.
Now, in this case is the the first side of the logic or || false, but it could be true if the other side - the third part - is true.

So the third part will be evaluated - mainly writing the message as a side effect. (It has the result 0 for true, which we do not use here)

The other cases are similar, but simpler - and - I promise! are - can be - easy to read!
(I don't have one, but I think being a UNIX veteran with grey beard helps a lot with this.)


you can also use use case/esac

case "$string" in
 "$pattern" ) echo "found";;
esac

following script reads from a file named "testonthis" line by line then compares each line with a simple string, a string with special characters and a regular expression if it doesn't match then script will print the line o/w not.

space in bash is so much important. so following will work

[ "$LINE" != "table_name" ] 

but following won't:

["$LINE" != "table_name"] 

so please use as is:

cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done

I would probably use regexp matches if the input has only a few valid entries. E.g. only the "start" and "stop" are valid actions.

if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
  echo "valid action"
fi

Note that I lowercase the variable $ACTION by using the double comma's. Also note that this won't work on too aged bash versions out there.


Bash4+ examples. Note: not using quotes will cause issues when words contain spaces etc.. Always quote in bash IMO.

Here are some examples 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

enjoy.


I did it in this way that is compatible with bash, dash (sh):

testOutput="my test"
pattern="my"

case $testOutput in (*"$pattern"*)
    echo "if there is a match"
    exit 1
    ;;
(*)
   ! echo there is no coincidence!
;;esac

참고URL : https://stackoverflow.com/questions/2237080/how-to-compare-strings-in-bash

반응형