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 语法(虽然严格来说rc是非 Bourne 语法,但之前就支持它),也被 bash 2.0 及更高版本、ksh93、yash 和 mksh(基于 pdksh)识别,但是实现之间存在一些重大差异

array=()在(空列表)的情况下,在 中ksh93,该变量必须事先(用typeset -a)声明为数组变量,因为这array=()与复合变量声明冲突。

至于$_install标量变量分裂,这就是 Bourne split+glob 运算符每当您在列表上下文中保留未加引号的变量扩展时就会调用,通常需要事先调整:

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...)

另请注意,虽然 the-ne或其他算术test/运算符的操作数是、 (以及大多数其他 shell)[中的任何算术表达式,但它们必须是十进制整数,因此 while:kshbash

[ i -ne 0 ]

ksh可以像算术表达式一样工作i,解析为变量的值$i,在 中bash,您需要:

[ "$i" -ne 0 ]

(用$i引号引起来,以免调用 split+glob 运算符),或者您可以使用andksh ((...))也支持的算术求值运算符:bashzsh

((i != 0))

答案3

$引用变量时请使用符号i

i=${_numver}
while [ $i -ne 0 ] 

这将纠正错误

"./test.sh: line 15: [: i: integer expression expected"

相关内容