![set -A 在 bash 中无效](https://linux22.com/image/74234/set%20-A%20%E5%9C%A8%20bash%20%E4%B8%AD%E6%97%A0%E6%95%88.png)
我尝试使用 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:ksh
bash
[ i -ne 0 ]
ksh
可以像算术表达式一样工作i
,解析为变量的值$i
,在 中bash
,您需要:
[ "$i" -ne 0 ]
(用$i
引号引起来,以免调用 split+glob 运算符),或者您可以使用andksh
((...))
也支持的算术求值运算符:bash
zsh
((i != 0))
答案3
$
引用变量时请使用符号i
i=${_numver}
while [ $i -ne 0 ]
这将纠正错误
"./test.sh: line 15: [: i: integer expression expected"