#!/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" ]
答案 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