パラメータを順番に提供するために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
(zsh
でzsh
,--
後ろに -A
エミュレーションを除いては認識されず、必要ありksh
ませんがbash
。
array=(values ...)
zsh構文(技術的にはrc
Bourne構文ではありませんが、以前はサポートされていました)で、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進整数でなければなりません。ksh
bash
[ i -ne 0 ]
ksh
算術式のように機能し、i
変数の値に解析できます$i
。これには次のものがbash
必要です。
[ "$i" -ne 0 ]
(split + glob演算子の呼び出しを避けるために引用符で囲む)またはandでサポートされている算術評価演算子を$i
使用できます。ksh
((...))
bash
zsh
((i != 0))
答え3
$
変数を参照するときにシンボルを使用するi
i=${_numver}
while [ $i -ne 0 ]
これによりエラーが修正されます。
"./test.sh: line 15: [: i: integer expression expected"