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( zsh에서 zsh,-- 뒤쪽에 -A에뮬레이션을 제외하고는 인식되지 않고 필요하지 ksh않지만 bash.

array=(values  ...)

zsh 구문(기술적으로는 rcBourne 구문이 아니지만 이전에는 지원됨)이며 bash 2.0 이상, ksh93, yash 및 mksh(pdksh 기반)에서도 인식됩니다.구현 간에는 몇 가지 중요한 차이점이 있습니다..

array=()(빈 리스트)의 경우, 복합 변수 선언과 충돌 하므로 ksh93변수를 미리 typeset -a배열 변수로 선언(with) 해야 합니다.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의 피연산자는 [, (및 대부분의 다른 쉘)의 산술 표현식이지만 십진수 정수여야 합니다.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"

관련 정보