매개변수를 순서대로 제공하기 위해 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
배열 변수로 선언(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
의 피연산자는 [
, (및 대부분의 다른 쉘)의 산술 표현식이지만 십진수 정수여야 합니다.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"