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のようなシェルでは、他のものzsh
が{
問題であることに注意してください。
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
本体はサブシェル(in)で実行されるため、ループ本体が終了した後に変数は存在しません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
予期しない結果が発生する可能性があるため、ループのファイル名ワイルドカードを無効にしました。
IMHO、最後のバリエーションは非常にエレガントではなく、数行以上の出力を生成するコマンドには完全には適していません。
答え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}
主張を引用する