如果条件为"不等于"在shell脚本中没有按预期工作

时间:2017-07-24 16:27:37

标签: bash shell

#!/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

这是我得到的输出:

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

我的问题是:尽管sam1和sam2相等,为什么if条件返回true?我检查了不平等。

即使我使用

,回复也是一样的
if [ $C -eq $a ] && [ "$sam2" != " $sam1" ]

2 个答案:

答案 0 :(得分:1)

正如Ansgar Wiechers所指出的那样,你错过了一个" $"在sam2变量前面。这样,您就可以比较文字字符串" sam2 "使用$sam1字符串值(最初设置为" xyz ")。你想要做的是比较两个变量的字符串值:

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

关于$C,您应该只包括要在反引号中评估的命令,而不是评估本身。这称为command substitution - 创建一个子shell,其中执行命令,反引号表达式由计算值替换。该行应如下所示:

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

您的for循环还需要命令替换:for x in ls | grep .rpm使您看起来好像是将for命令的输出传递给grep。您要做的是迭代ls | grep部分,您可以使用以下命令替换来执行此操作:

for x in `ls | grep .rpm`

答案 1 :(得分:0)

嗨,大家得到了解决方案:

#!/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