set -A
é um comando ksh
, mas você está executando seu script com bash
. O bash
equivalente seria simplesmente
arrinstall=(${_install})
Estou tentando alimentar argumentos sequencialmente usando o set -A, para que eu possa excluir primeiro a versão mais alta e depois a base. Mas recebo um erro para o comando set.
Aqui está o código
_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
Aqui está o erro que recebo
./test.sh: line 8: set: -A: invalid option
set: usage: set [--abefhkmnptuvxBCHP] [-o option-name] [arg ...]
./test.sh: line 15: [: i: integer expression expected
O que estou fazendo errado aqui?
aqui estão as saídas das variáveis,
$ 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
set -A array -- values ...
é a sintaxe do ksh88, também reconhecida por pdksh
e derivados, ksh93
e zsh
(em zsh
, o --
após -A
não é reconhecido nem necessário exceto em ksh
emulation), mas não bash
.
array=(values ...)
é a sintaxe ksh93 (embora, a rigor, rc
com uma sintaxe diferente de Bourne, suportada antes disso), também reconhecida pelo bash 2.0 e acima, zsh, yash e mksh (baseado em pdksh) mas com algumas diferenças importantes entre implementações .
No caso de array=()
(uma lista vazia), em ksh93
, a variável deve ter sido declarada como uma variável de matriz antecipadamente (com typeset -a
) enquanto array=()
entra em conflito com a declaração de variável composta.
Quanto à divisão variável $_install
escalar, esse é o operador Bourne split + glob chamado sempre que você deixa uma expansão variável sem aspas no contexto da lista, o que geralmente precisa ajustar de antemão:
IFS=$'\n' # split on newline only
set -o noglob # disable the glob part which we don't want here
array=($_install) # invoke split+glob
Note que em zsh, split e / ou globbing precisam ser solicitados explicitamente, então:
IFS=$'\n'
array=($=_install) # split only, with the $=var operator
Embora, você prefira usar o sinalizador de expansão de parâmetro (f)
para dividir em feeds de linha:
array=(${(f)_install})
Em bash
, você pode usar o comando readarray
para obter linhas em uma matriz:
readarray -t array < <(printf '%s\n' "$_install")
Ou diretamente:
readarray -t array < <(rpm -q...)
Observe também que, embora os operandos dos operadores -ne
ou outros operadores aritméticos test
/ [
sejam qualquer expressão aritmética em ksh
, em bash
(e na maioria das outras shells), eles devem ser decimais inteiros, assim enquanto:
[ i -ne 0 ]
funcionaria em ksh
como i
é uma expressão aritmética que resolve o valor da variável $i
, em bash
, você precisaria:
[ "$i" -ne 0 ]
(com $i
cotado para não chamar o operador split + glob), ou você pode usar o operador de avaliação aritmética ksh
((...))
também suportado por bash
e zsh
:
((i != 0))
Por favor, use o sinal $
enquanto se refere à variável i
i=${_numver}
while [ $i -ne 0 ]
Isso corrigirá o erro
"./test.sh: line 15: [: i: integer expression expected"
Tags bash