set -A inválido no bash

1

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
    
por MO12 02.10.2015 / 18:31

3 respostas

3

set -A é um comando ksh , mas você está executando seu script com bash . O bash equivalente seria simplesmente

arrinstall=(${_install})
    
por 02.10.2015 / 18:55
3
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 31.10.2017 / 10:02
1

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"
    
por 31.10.2017 / 08:19

Tags