亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

shell腳本中數組的用法

發布時間:2021-09-04 18:48:09 來源:億速云 閱讀:131 作者:chen 欄目:系統運維

本篇內容介紹了“shell腳本中數組的用法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

問題描述:某個員工的linux系統有大量重復的軟件(版本不同),導致使用yum安裝軟件時報錯。現在需要將重復的軟件找出來,將低版本的軟件刪掉。執行rpm -qa | sort 顯示如下:

[root@cws85 ~]# rpm -qa | sort 
a52dec-0.7.4-27.el7.x86_64
aalib-libs-1.4.0-0.22.rc5.el7.x86_64
abattis-cantarell-fonts-0.0.25-1.el7.noarch
abrt-2.1.11-52.el7.centos.x86_64
abrt-addon-ccpp-2.1.11-52.el7.centos.x86_64
abrt-addon-kerneloops-2.1.11-52.el7.centos.x86_64
abrt-addon-pstoreoops-2.1.11-52.el7.centos.x86_64
abrt-addon-python-2.1.11-52.el7.centos.x86_64
abrt-addon-vmcore-2.1.11-52.el7.centos.x86_64
abrt-addon-xorg-2.1.11-52.el7.centos.x86_64
abrt-cli-2.1.11-52.el7.centos.x86_64
abrt-console-notification-2.1.11-52.el7.centos.x86_64
abrt-dbus-2.1.11-52.el7.centos.x86_64
abrt-desktop-2.1.11-52.el7.centos.x86_64
abrt-gui-2.1.11-52.el7.centos.x86_64
abrt-gui-libs-2.1.11-52.el7.centos.x86_64
abrt-java-connector-1.0.6-12.el7.x86_64
abrt-libs-2.1.11-52.el7.centos.x86_64
abrt-python-2.1.11-52.el7.centos.x86_64
abrt-retrace-client-2.1.11-52.el7.centos.x86_64
abrt-tui-2.1.11-52.el7.centos.x86_64
accountsservice-0.6.50-4.el7.1.x86_64
accountsservice-libs-0.6.50-4.el7.1.x86_64
acl-2.2.51-14.el7.x86_64
adcli-0.8.1-6.el7_6.1.x86_64
adwaita-cursor-theme-3.28.0-1.el7.noarch
adwaita-gtk2-theme-3.28-2.el7.x86_64
adwaita-icon-theme-3.28.0-1.el7.noarch
adwaita-qt5-1.0-1.el7.x86_64
aic94xx-firmware-30-6.el7.noarch
alsa-firmware-1.0.28-2.el7.noarch
alsa-lib-1.1.6-2.el7.x86_64
alsa-plugins-pulseaudio-1.1.6-1.el7.x86_64
alsa-tools-firmware-1.1.0-1.el7.x86_64
alsa-utils-1.1.6-1.el7.x86_64
anaconda-core-21.48.22.121-1.el7.centos.x86_64
anaconda-core-21.48.22.147-1.el7.centos.0.1.x86_64
anaconda-gui-21.48.22.147-1.el7.centos.0.1.x86_64
anaconda-tui-21.48.22.121-1.el7.centos.x86_64                 #這是重復軟件的低版本
anaconda-tui-21.48.22.147-1.el7.centos.x86_64          #這是重復軟件的高版本
anaconda-widgets-21.48.22.147-1.el7.centos.0.1.x86_64
..........省略
總共2586個軟件

要求:如上所示,需要將低版本的軟件刪除,如下是例外:

[root@cws85 ~]# rpm -qa | grep audit-libs-[0-9]  
audit-libs-2.8.4-4.el7.i686
audit-libs-2.8.4-4.el7.x86_64
雖然是重復軟件,但一個是x86_64,一個是i686,這樣不能刪除,只能刪除重復的_x86_64結尾的軟件

數組:腳本中用到了數組,下面是數組的部分內容概述:

1.數組定義:
declare -a  數組名    #定義索引數組,下標從0開始
declare -A 數組名    #定義關聯數組,下標為任意字符

2.數組賦值與復制:
2.1.可以通過命令替換的方式給數組賦值: declare -a SOFT1=($(rpm -qa | sort))  #數組SOFT1保存著所有軟件
2.2.數組復制操作:linux2=(${linux1[@]}) #數組linux2復制了數組linux1的內容

3.數組的字符串操作:
3.1.字符串的操作符可以用在數組上,如:${#string} 用于數組 ${#array[@]},等等等等。
3.2.數組遍歷: for i in ${!SOFT[@]}  #注意加上感嘆號可以遍歷數組中的值,假設SOFT的下標最大是2586,通過for循環可以遍歷完數組,i的值從0依次到2586。

腳本內容:

#!/bin/bash
declare -a SOFT1=($(rpm -qa | sort))      #數組SOFT1保存所有軟件名稱

for i in ${!SOFT1[*]}                 #遍歷數組SOFT1
 do
   declare -a SOFT2[$i]=${SOFT1[$i]%%-[0-9]*}        #數組SOFT2復制數組SOFT1的部分內容,%%是字符串截取符號,相當于去掉軟件的版本號,只保留軟件名稱
 done

for i in $(seq 0 $((${#SOFT2[@]}-1)))        #遍歷數組SOFT2
  do
     let "j=$i+5"  
     for (( ;i<j;j--))            #i小于j時跳出循環,循環執行5次
       do
         if [ "${SOFT2[$i]}" == "${SOFT2[$j]}" ]     #測試是否有重復軟件
           then
              declare -a SOFT3=($(rpm -qa | grep "^${SOFT2[$i]}-[0-9]" | sort))    #如果軟件有重復,執行rpm -qa | grep 重復軟件名,賦值給數組SOFT3
              if (( "${#SOFT3[@]}" < 2 ))     #檢測數組SOFT3的下標個數是否小于2(多加一層保險)
                then
                   echo "${SOFT2[$i]} no repeat version" >>/tmp/soft  && continue    #小于2輸出該軟件沒有重復的版本
              elif (( "${#SOFT3[@]}" > 2 ))     #如果下標大于2,也就是(rpm -qa | grep 重復軟件)有多于2個軟件
                then
                   X86=0 I686=0           #初始化兩個變量,用于后面比較
                   for i in ${!SOFT3[*]}      #遍歷數組SOFT3
                     do
                       [[ "${SOFT3[$i]##*.}" == "i686" ]] && I686=$((I686+1)) || X86=$((X86+1))     #如果軟件名結尾是i686,那么變量I686加1,否則X86加1
                     done
                       (( "$X86" >= "$I686" )) && echo "${SOFT3[0]} can1 delete" >>/tmp/soft      #如果X86值大于I686,輸出軟件能夠刪除
               elif (( "${#SOFT3[@]}" == 2 ))         #如果下標等于2,也就是(rpm -qa | grep 重復軟件)有兩個
                then
                   [[ "${SOFT3[0]##*.}" == "i686" || "${SOFT3[1]##*.}" == "i686" ]] && { echo "${SOFT3[0]} only two packages but has I686" >>/tmp/soft ; continue ; }          #兩個軟件里只要有1個是i686結尾的,輸出不能刪除
                   echo "${SOFT3[0]} can2 delete" >>/tmp/soft
             fi
         fi

     done
  done

腳本說明

1.數組SOFT1保存所有軟件的完整名稱,數組SOFT2是通過數組復制加上字符串的替換,截取出不帶版本名稱的軟件名,比如 SOFT1[4]=abrt-addon-ccpp-2.1.11-52.el7.centos.x86_64,  SOFT2[4]=abrt-addon-ccpp。

2.利用for循環遍歷數組SOFT2來檢測那些是重復軟件,如下:

for i in $(seq 0 $((${#SOFT2[@]}-1)))       #遍歷數組SOFT2
do    
     let  "j=$i+5"       #j比i大5,用于測試某個軟件名與它后面的5個軟件名是否相等,因為是通過rpm -qa | sort排序過,所以軟件名都是按照字母順序排的,比較5個就可以了。  
     for (( ;i<j;j--))        
         do
             if [ "${SOFT2[$i]}" == "${SOFT2[$j]}" ]         #比較是否有重復軟件名

3.如果有重復,需要處理軟件后綴名的問題,只有重復的以X86結尾的軟件名才輸出該軟件可以刪除。利用數組SOFT3=($(rpm -qa | grep "^${SOFT2[$i]}-[0-9]" | sort)) 來保存搜索出的重復軟件,然后在進行判斷比較

腳本輸出結果:輸出被重定向到文件里,文件內容如下:

anaconda-core-21.48.22.121-1.el7.centos.x86_64 can2 delete
anaconda-tui-21.48.22.121-1.el7.centos.x86_64 can2 delete
audit-libs-2.8.4-4.el7.i686 only two packages but has I686
avahi-libs-0.6.31-17.el7.x86_64 can2 delete
bzip2-libs-1.0.6-13.el7.i686 only two packages but has I686
copy-jdk-configs-2.2-5.el7_4.noarch can2 delete
cracklib-2.9.0-11.el7.i686 only two packages but has I686
cryptsetup-libs-1.7.4-3.el7_4.1.x86_64 can2 delete
dbus-1.10.24-13.el7_6.x86_64 can2 delete
dbus-libs-1.10.24-13.el7_6.x86_64 can2 delete
device-mapper-event-libs-1.02.149-10.el7_6.3.x86_64 can2 delete
elfutils-libelf-0.172-2.el7.i686 only two packages but has I686
elfutils-libs-0.172-2.el7.i686 only two packages but has I686
fprintd-0.5.0-4.0.el7_0.x86_64 can2 delete
freetype-2.8-12.el7_6.1.i686 only two packages but has I686
glib2-2.54.2-2.el7.x86_64 can2 delete
glibc-2.17-260.el7_6.6.i686 only two packages but has I686
........省略
總共81行,能刪除的有52行(有少數錯誤,后面說明)

腳本調試信息:sh -x 腳本名顯示的部分內容如下:

+ SOFT1=($(rpm -qa | sort))      #數組SOFT1保存完整軟件名
++ rpm -qa
++ sort
+ declare -a SOFT1
+ for i in '${!SOFT1[*]}'                #遍歷數組SOFT1 
+ declare -a 'SOFT2[0]=a52dec'      #給數組SOFT2賦值,只保留軟件名
+ for i in '${!SOFT1[*]}'
+ declare -a 'SOFT2[1]=aalib-libs'
+ for i in '${!SOFT1[*]}'
+ declare -a 'SOFT2[2]=abattis-cantarell-fonts'
+ for i in '${!SOFT1[*]}'
+ declare -a 'SOFT2[3]=abrt'
+ for i in '${!SOFT1[*]}'
+ declare -a 'SOFT2[4]=abrt-addon-ccpp'
+ ..............省略,總共2586個

++ seq 0 2585   
+ for i in '$(seq 0 $((${#SOFT2[@]}-1)))'          #遍歷數組SOFT2,測試哪些是重復軟件
+ let j=0+5       #總共比較5次
+ (( 1 ))
+ (( i<j ))
+ '[' a52dec == abrt-addon-kerneloops ']'
+ (( j-- ))
+ (( i<j ))
+ '[' a52dec == abrt-addon-ccpp ']'
+ (( j-- ))
+ (( i<j ))
+ '[' a52dec == abrt ']'
+ (( j-- ))
+ (( i<j ))
+ '[' a52dec == abattis-cantarell-fonts ']'
+ (( j-- ))
+ (( i<j ))
+ '[' a52dec == aalib-libs ']'                             #a53dec...不是一個重復軟件
+ (( j-- ))
+ (( i<j ))
+ for i in '$(seq 0 $((${#SOFT2[@]}-1)))'     #比較下一個,數組下標加1
+ let j=1+5
...........................................................................省略
+ for i in '$(seq 0 $((${#SOFT2[@]}-1)))'
+ let j=35+5             #數組下標到35
+ (( 1 ))
+ (( i<j ))
+ '[' anaconda-core == anaconda-widgets ']'
+ (( j-- ))
+ (( i<j ))
+ '[' anaconda-core == anaconda-tui ']'
+ (( j-- ))
+ (( i<j ))
+ '[' anaconda-core == anaconda-tui ']'
+ (( j-- ))
+ (( i<j ))
+ '[' anaconda-core == anaconda-gui ']'
+ (( j-- ))
+ (( i<j ))
+ '[' anaconda-core == anaconda-core ']'                                 #這里找到重復軟件
+ SOFT3=($(rpm -qa | grep "^${SOFT2[$i]}-[0-9]" | sort))     #數組SOFT3賦值=(rpm -qa |grep ^anaconda-core-[0-9]|sort)
++ rpm -qa
++ sort
++ grep '^anaconda-core-[0-9]'
+ declare -a SOFT3
+ ((  2 < 2  ))
+ ((  2 > 2  ))
+ ((  2 == 2  ))      #剛好有兩個包
+ [[ x86_64 == i686 ]]     #第一個包后綴是x86_64
+ [[ x86_64 == i686 ]]    #第二個包后綴是x86_64
+ echo 'anaconda-core-21.48.22.121-1.el7.centos.x86_64 can2 delete'      #輸出能刪除
+ ..........................省略

腳本輸出錯誤:腳本輸出文件里總共有52行是能刪除的軟件,其中有幾個是錯誤的,由于軟件名稱導致的錯誤,如下:

錯誤1: 軟件名稱: 字符-數字-字符-版本號  導致判斷錯誤
java-1.8.0-openjdk-1.8.0.222.b10-0.el7_6.x86_64 can1 delete
java-1.8.0-openjdk-1.8.0.222.b10-0.el7_6.x86_64 can1 delete
SOFT2[$i]=${SOFT1[$i]%%-[0-9]*}  #問題就在截取軟件名稱上,SOFT2=java, 正確的應該是SOFT2=java-1.8.0-openjdk。

錯誤2:錯誤的軟件名稱結尾,該軟件沒有以.X86或其他結尾
gpg-pubkey-0c1289c0-58c6ad7d can1 delete
gpg-pubkey-0c1289c0-58c6ad7d can1 delete
gpg-pubkey-0c1289c0-58c6ad7d can1 delete
在給SOFT1賦值的時候需要過濾掉這種沒有以.X86或其他后綴結尾的軟件

總結:很少在腳本中用到數組,通過這個腳本加深了對數組的掌握與應用。不知道怎么解決腳本輸出中的錯誤1這種問題,大部分的軟件都能正確去掉版本號,個別的軟件名就不行,感覺總會有漏洞。該腳本主要在于練習數組的應用,同時也能從二千多個軟件里面找出重復軟件,雖然有個別錯誤,但也會比用眼睛找重復軟件好,對照著輸出文件來刪除軟件會輕松很多。

“shell腳本中數組的用法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

女性| 喀喇沁旗| 永康市| 白河县| 治多县| 蓝田县| 会同县| 合肥市| 黄陵县| 南通市| 高邑县| 木兰县| 胶南市| 远安县| 宜宾县| 伽师县| 敖汉旗| 稷山县| 绥中县| 乌兰察布市| 南康市| 兴文县| 临清市| 威海市| 凉城县| 科技| 南充市| 清远市| 颍上县| 扬州市| 崇明县| 宽甸| 上饶县| 清徐县| 五指山市| 通城县| 肇源县| 陆河县| 平乡县| 元谋县| 台南市|