我收集 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 可以工作。
答案1
问题是您的命令替换扩展到以空格分隔的字符串,并且循环将迭代所有字在那根弦里。 “单词”是由空格、制表符或换行符分隔的任何内容。
另请注意,在除 之外的类似 Bourne 的 shell 中zsh
,这些单词进一步受到文件名生成(又名通配符)的影响,因此{
除了空格和制表符之外,通配符(在某些 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(in)中执行bash
,因此lpar
循环体结束后该变量将不存在。如果您只在循环体中使用变量,那么这不是问题。
有关的:理解“IFS=读取-r行”
另一个解决方案是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
包含如上所述的文件名通配符模式,我们可能会得到意外的结果。
恕我直言,最后一个变体非常不优雅,并且完全不适合产生多于几行输出的命令。
答案2
我会尝试
for lpar in $(lssyscfg -r lpar -m $system -F name,lpar_env |awk -F, '{printf "\"%s\"",$1}' | sort)
do
echo "$lpar"
done
- 用作
$( )
命令替换 {printf "\"%s\"",$1}
将引用论点