スペースを使用した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のようなシェルでは、他のもの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)で実行されるため、ループ本体が終了した後に変数は存在しませんbashlparループ本文内でのみ変数を使用する場合は問題になりません。

関連:「IFS=read-r-line」を理解する

別の解決策は、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、最後のバリエーションは非常にエレガントではなく、数行以上の出力を生成するコマンドには完全には適していません。

おすすめ記事