我收集LPAR名称并在AIX上分配一个变量,然后使用多个命令进行处理。
系统上的LPAR名称为:ABCD56777 TSM Mobile CD CPT 2
for lparname in `lssyscfg -r lpar -m $system -F name,lpar_env |cut -f 1 -d, | sort`;
但是,上面的for循环变量在空格之后并没有获取完整的LPAR值。(确切的LPAR名称是:ABCD56777 TSM Mobile CD CPT 2)
它将LPAR的值分配为单独的ABCD56777。
您能建议我如何分配带空格的变量吗?不幸的是,awk没有安装,只有sed可以工作。
问题是您的命令替换扩展为以空格分隔的字符串,并且循环将迭代该字符串中的所有单词。“单词”是由空格,制表符或换行符分隔的任何内容。
另请注意,在以外的类似Bourne的shell中zsh
,这些单词还受到文件名生成(aka globbing)的影响,因此{
,除了空格和制表符之外,通配符(在某些shell中)也将成为问题。
lssyscfg -r lpar -m "$system" -F name,lpar_env | cut -d, -f 1 | sort |
while IFS= read -r lpar; do
echo "$lpar"
done
这使用while
循环而不是静态for
循环。所述while
循环体在子Shell(在执行bash
),所以lpar
变量不会循环体结束之后存在。如果只在循环主体中使用变量,那不是问题。
另一种解决方案是IFS
在循环之前将其设置为换行符(并在之后将其重置):
oldIFS=$IFS
IFS=$'\n' # assumes bash
set -o noglob
for lpar in $( lssyscfg -r lpar -m "$system" -F name,lpar_env | cut -d, -f 1 | sort )
do
echo "$lpar"
done
set +o noglob
IFS=$oldIFS
默认值$IFS
包括空格,这就是为什么您的原始循环遍历错误内容的原因。我还为循环关闭了文件名遍历功能,因为如果返回的文本lssyscfg
包含上述文件名遍历模式,我们可能会得到意想不到的结果。
最后的变化是恕我直言,非常不雅致,并且完全不适用于产生多行输出的命令。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句