set -Aはbashでは機能しません

set -Aはbashでは機能しません

パラメータを順番に提供するためにset -Aを使用してみたので、最初のバージョンを削除してからデフォルトバージョンを削除することができました。しかし、setコマンドエラーが発生します。

これはコードです

    _install=$(rpm -qa --qf "%{NAME}-%{VERSION}-%{RELEASE}\t%{INSTPREFIXES}\n" | grep MQSeriesRuntime | grep 7.0 | grep -v 7.0.1-0 | sort -r | awk '{print $1}')
 _numver=$(rpm -qa --qf "%{NAME}-%{VERSION}-%{RELEASE}\t%{INSTPREFIXES}\n" | grep MQSeriesRuntime | grep 7.0 | grep -v 7.0.1-0 | wc -l)
set -A arrinstall ${_install}

##########################################
# Get a list of all MQ install instances #
##########################################
i=${_numver}
arrayindex=0
while [ i -ne 0 ]
do
  _inst_level=${arrinstall[$arrayindex]}
  _Unum=$(echo ${_inst_level} |  sed -e 's/-/ /g' | awk '{print $2}')
  _Level=$(echo ${_inst_level} |  sed -e 's/-/ /g' | awk '{print $4}')
  i=$((i-1))
  arrayindex=$((arrayindex+1))
done

これは私が得るエラーです

./test.sh: line 8: set: -A: invalid option
set: usage: set [--abefhkmnptuvxBCHP] [-o option-name] [arg ...]
./test.sh: line 15: [: i: integer expression expected

私がここで何を間違っているのでしょうか?

これは変数の出力です。

$ rpm -qa --qf "%{NAME}-%{VERSION}-%{RELEASE}\t%{INSTPREFIXES}\n" |grep MQSeriesRuntime |grep 7.0 | grep -v 7.0.1-0 |sort -r |awk '{print $1}'
MQSeriesRuntime-U860943-7.0.1-12
MQSeriesRuntime-U860173-7.0.1-11

$ rpm -qa --qf "%{NAME}-%{VERSION}-%{RELEASE}\t%{INSTPREFIXES}\n" |grep MQSeriesRuntime |grep 7.0 | grep -v 7.0.1-0 |wc -l
2

答え1

set -Aコマンドkshですが、実行スクリプトを使用していますbash。同等のものはbash単に

arrinstall=(${_install})

答え2

set -A array -- values ...

ksh88 構文はpdkshおよび 派生語としても認識されますksh93(zshzsh,-- 後ろに -Aエミュレーションを除いては認識されず、必要ありkshませんがbash

array=(values  ...)

zsh構文(技術的にはrcBourne構文ではありませんが、以前はサポートされていました)で、bash 2.0以降、ksh93、yash、およびmksh(pdkshベース)でも認識されます。実装間にはいくつかの重要な違いがあります。

array=()(空のリスト)の場合、複合変数宣言と競合するため、ksh93変数を事前にtypeset -a配列変数として宣言する必要があります。array=()

$_installスカラー変数分割の場合、これはBourneの分割+グローブ演算子です。リストのコンテキストで引用符なしの変数拡張を維持するたびに呼び出され、通常は事前調整が必要です。

IFS=$'\n' # split on newline only
set -o noglob # disable the glob part which we don't want here
array=($_install) # invoke split+glob

zshでは、分割および/またはワイルドカードの指定を明示的に要求する必要があるため、次のようになります。

IFS=$'\n'
array=($=_install) # split only, with the $=var operator

(f)ただし、改行に分割するには、パラメータ拡張フラグを使用することをお勧めします。

array=(${(f)_install})

以下を使用して行を配列に配置bashできます。readarray

readarray -t array < <(printf '%s\n' "$_install")

または直接:

readarray -t array < <(rpm -q...)

また-ne、または他の算術演算子testのオペランドは[、(および他のほとんどのシェル)の算術式ですが、10進整数でなければなりません。kshbash

[ i -ne 0 ]

ksh算術式のように機能し、i変数の値に解析できます$i。これには次のものがbash必要です。

[ "$i" -ne 0 ]

(split + glob演算子の呼び出しを避けるために引用符で囲む)またはandでサポートされている算術評価演算子を$i使用できます。ksh ((...))bashzsh

((i != 0))

答え3

$変数を参照するときにシンボルを使用するi

i=${_numver}
while [ $i -ne 0 ] 

これによりエラーが修正されます。

"./test.sh: line 15: [: i: integer expression expected"

関連情報