次のコードを期待すると、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ループのボディに、より複雑な何かをするつもり、もちろん、しかし、正確な反復方法は配列のすべての要素をリストしません。
FYIの 'for line in $(foo)'はコードの臭いです。たとえば '*'だけを含む行があれば、カレントディレクトリのファイルのリストに展開されます。これを行う正しい方法については、[BashFAQ#1](http://mywiki.wooledge.org/BashFAQ/001)を参照してください。 –