Dhiru
Dhiru

Reputation: 3

If condition for "not equal" is not working as expected in shell script

#!/bin/bash
a=2
b=2
COUNTER=0
sam="abcd"
sam1="xyz"
sam2="mno"
for x in ls | grep .rpm
do
  `C=rpm -qpR $x | grep -v CompressedFileNames | grep -v PayloadFilesHavePrefix | wc -l`

  if [ "sam2"!="$sam1" ]
  then
    echo "${sam1}"
    echo "${sam2}"
    if [ $C -eq $a ]
    then
      COUNTER=$((COUNTER+1))
      echo "${x}"
      eval sam=$x
      #eval sam1=sam | cut -d '-' -f 1
      sam1=`echo "${sam}"| cut -d '-' -f 1`

      if [ $COUNTER -eq $b ]
      then
        break
      fi
    fi
  fi
  sam2=`echo "${x}"| cut -d '-' -f 1`
done

This is the output I am getting:

xyz
mno
comps-4ES-0.20050107.x86_64.rpm
comps
comps
comps-4ES-0.20050525.x86_64.rpm

My question is: why is the if condition returning true despite sam1 and sam2 being equal? I have checked for non-equality.

Response is the same even if I use

if [ $C -eq $a ] && [ "$sam2" != " $sam1" ]

Upvotes: 0

Views: 8738

Answers (2)

Elias Regopoulos
Elias Regopoulos

Reputation: 41

As Ansgar Wiechers pointed out, you're missing a "$" in front of the sam2 variable. That way, you're comparing the literal string "sam2" with the string value of $sam1 (which initially is set to "xyz"). What you want to do is compare the string values of both variables:

if [ "$sam2" != "$sam1" ]

Regarding $C, you should only include the commands to be evaluated inside backticks, not the evaluation itself. This is called a command substitution - a subshell is created in which the commands are executed, and the backtick expression is substituted by the computed value. The line should look like this:

C=`rpm -qpR $x | grep -v CompressedFileNames | grep -v PayloadFilesHavePrefix | wc -l`

Your for loop also needs a command substitution: for x in ls | grep .rpm makes it look as if you're piping the output of a for command into grep. What you want to do is iterate over the ls | grep part, which you can do with the following command substitution:

for x in `ls | grep .rpm`

Upvotes: 1

Dhiru
Dhiru

Reputation: 3

Hi Guys Got the solution:

#!/bin/bash
read -p "enter dep number" a
read -p "enter no of rpms" b
COUNTER=0
sam="abcd"
sam1="xyz"
sam2="mno"
for x in `ls | grep .rpm`
do

C=`rpm -qpR $x |grep -v CompressedFileNames |  grep -v PayloadFilesHavePrefix | wc -l`
#   echo "${C}:c"
if [ $C -eq $a ]  && [ "$sam2" != "$sam1" ]
then
COUNTER=$((COUNTER+1))
#   echo "${COUNTER}:counter"
#  echo "${x}"
eval sam=$x
#eval sam1=sam | cut -d '-' -f 1
sam1=`echo "${sam}"| cut -d '-' -f 1`
     if [ $COUNTER -eq $b ]
      then
       break
     fi
  fi

 sam2=`echo "${x}"| cut -d '-' -f 1`
 #echo "${sam2}"
 #echo "${sam1}"

 done

Upvotes: 0

Related Questions