配列内に rpm パッケージが存在するかどうかを確認する

配列内に rpm パッケージが存在するかどうかを確認する

特定の RPM パッケージが配列内に存在するかどうかを調べようとしています。パッケージのいずれかが欠落している場合は、「パッケージが存在しません」というメッセージで終了します。これが私のコードです。

#!/bin/bash


 echo "Checking for Pre-requisites X11 libraries required for installation"
 my_array=(xorg-x11-drivers xorg-x11-utils xorg-x11-xauth xorg-x11-xinit initial-setup-gui initial- 
 setup-gui install initial-setup-gui glx-utils )

 for (( i = 0; i < ${#my_array[@]} ; i++ )); do
 #printf "\n**** checking: ${my_array[$i]} *****\n\n"
 if  rpm ! -qa  "${my_array[$i]}"
 then
 echo "Package missing"
 exit 1
 else
 echo "All Package available"
 exit
 fi

終わり

しかし、これは一致するパッケージを見つけることで終了するという逆のことを行っているようです。誰か、私がここで何を間違えているのか教えてもらえますか?

答え1

2 つの問題があります:

  1. rpm -qa、本当に議論が必要でしょうか?rpm -q必要になります。
  2. rpm ! -qa、シェルでは動作しません! rpm -qa

答え2

doneコードが不完全なようです。ループの終了がありません。句がループ内にあるfor場合、コマンドによってスクリプト全体が停止します ( の両側にこれがあるため、常に最初の項目の後で停止します)。ifexitelse

このように配列を連結するとおそらく機能しますが、もっと簡単な方法があります。たとえば (未テスト):

echo "Checking for Pre-requisites X11 libraries required for installation"
my_array=(xorg-x11-drivers xorg-x11-utils xorg-x11-xauth xorg-x11-xinit initial-setup-gui initial-setup-gui install initial-setup-gui glx-utils )
missing=()

for package in "${my_array[@])"; do
  rpm -q "${package}" || missing+=("${package}")
done

if [ ${#missing[@]} -gt 0 ] ; then
  echo "Packages missing: ${missing[@]}"
  exit 1
else
  echo "All Packages available"
  exit
fi

関連情報