带空格的 for 循环变量赋值

带空格的 for 循环变量赋值

我收集 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}将引用论点

相关内容