2016-10-14 13 views
0

次のコードを期待すると、2つの共有メモリIDの配列があります。アタッチメントがゼロのIDをリストするもの、およびアタッチメントがゼロ以上のIDをリストするもの。bash配列に値を追加する

------ Shared Memory Segments -------- 
key  shmid  owner  perms  bytes  nattch  status  
0x6c020df2 131072  monitor 600  4276656 6      
0x77020d34 4620289 usera  666  104  0      
0x78020d34 4653058 usera  666  651328000 0      
0x72020d34 4685827 usera  666  15808  0      

そしてコードは以下のとおりである:私はパースだ

コマンド出力リレーがある

free_shmids=() 
used_shmids=() 

IFS=$'\n' 

for line in $(sudo ipcs -m | grep '0x'); do 
    nattch=$(echo $line | awk '{ print $NF; }') 
    shmid=$(echo $line | awk '{ print $2; }') 

    if [ $nattch -eq "0" ]; then 
    free_shmids+=($shmid) 
    else 
    used_shmids+=($shmid) 
    fi 
done 

unset -v IFS 

代わりに、無料のIDのリストは、ちょうど最初のフリーIDです3つの利用可能。私はここで共有メモリセグメントを1つしか使用していないので、私はそれが証明できないとしても同じ方法で失敗すると仮定します。

参考のため、私はbash 4.3.11を実行していますので、アレイの構文は+=になっています。

EDIT:

無料IDの配列を反復するために、私はこれをやっている:

for id in $free_shmids; do 
    echo $id 
done 

私はforループのボディに、より複雑な何かをするつもり、もちろん、しかし、正確な反復方法は配列のすべての要素をリストしません。

+0

FYIの 'for line in $(foo)'はコードの臭いです。たとえば '*'だけを含む行があれば、カレントディレクトリのファイルのリストに展開されます。これを行う正しい方法については、[BashFAQ#1](http://mywiki.wooledge.org/BashFAQ/001)を参照してください。 –

答えて

2

私はあなたがこれをやっている賭け:それ以来

echo $free_shmid 

が配列である、あなたは右の構文を使用していません。インデックスを指定せずに配列の参照を解除すると、配列の最初の要素だけが表示されます。

printf "free: %s\n" "${free_shmid[@]}" 
    printf "used: %s\n" "${used_shmid[@]}" 

そしてwhile readループを使用して、一般的には、入力の行を読み取るためにforループを使用するよりも優先されます。このような何かを行います。例えば

#!/bin/bash 
data="------ Shared Memory Segments -------- 
key  shmid  owner  perms  bytes  nattch  status  
0x6c020df2 131072  monitor 600  4276656 6      
0x77020d34 4620289 usera  666  104  0      
0x78020d34 4653058 usera  666  651328000 0      
0x72020d34 4685827 usera  666  15808  0      " 

echo "$data" | { 
    read title  # first line 
    read header  # second line 
    # now read and process the rest 
    while read -r key shmid owner perms bytes nattch status; do 
     if ((nattch == 0)); then 
      free_shmid+=($shmid) 
     else 
      used_shmid+=($shmid) 
     fi 
    done 

    printf "free: %s\n" "${free_shmid[@]}" 
    printf "used: %s\n" "${used_shmid[@]}" 
} 

出力

free: 4620289 
free: 4653058 
free: 4685827 
used: 131072 

配列の要素を反復するために、あなたに必見は、次の操作を行います。

for elem in "${array[@]}"; do ... 

はい、すべての引用符とその他の文字は絶対に必要です。

+0

ああ、それは物事を行うのは非常に奇妙な方法です。ありがとうございました。しかし、私は実際に別の 'for'ループを使って配列を読み込んでいます。元の質問にスニペットを追加します。 – musasabi

+0

ああ、もちろん私はする必要があります。 – musasabi

関連する問題