2017-07-24 57 views
0
#!/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 

這是我得到的輸出:如果條件爲「不等於」預期在shell腳本不工作

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

我的問題是:爲什麼是if條件儘管SAM1返回true和sam2是否相等?我檢查了不平等。

反應是一樣的,即使我用

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

'「SAM2」 =「$ SAM1 「' - >'」$ sam2「!=」$ sam1「'; \'C = ... \''''C ='...''' –

+2

使用http://shellcheck.net檢查此內容,並且在反引號內使用'C =',分配將發生在子外殼,所以不會出現在父母 –

+0

真的嗎? '用於ls中的x | grep .rpm'? 'for * in .rpm'有什麼問題? – ghoti

回答

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 
1

由於安斯加爾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使它看起來好像你配管的輸出的命令到grep的。你想要做的是遍歷ls | grep部分,你可以用下面的命令替換做到:

for x in `ls | grep .rpm` 
+1

[你不想遍歷'ls'輸出](http://mywiki.wooledge.org/ParsingLs)。你想迭代[文件名模式擴展](https://www.gnu.org/software/bash/manual/bashref.html#Filename-Expansion):'for * in * .rpm' –