2つのforループの代わりに単一のforループを実行するより良い方法

2つのforループの代わりに単一のforループを実行するより良い方法

これはうまくいきますが、私のやり方は少し愚かです。もっと良い方法がありますか?

for e in $(ipcs | awk '{print $2}'); do
    [[ "$e" = "Semaphore" ]] && break
    echo $e
    ipcrm shm $e
done

    echo $e outside for loop
for e in $(ipcs | awk '{print $2}'); do
    [[ "$e" = "Message" ]] && break
    echo $e
    ipcrm -s $e
done

echo
exit 0

ipcsを実行するとこのようになります。

$ ipcs

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 262145     bob        600        393216     2          dest         
0x00000000 2523138    bob        600        393216     2          dest         
0x00000000 2555907    bob        600        393216     2          dest         
0x00000000 3375108    bob        600        998400     2          dest         
0x00000000 3440645    bob        666        40         1                       

------ Semaphore Arrays --------
key        semid      owner      perms      nsems     
0x000005b1 262146     bob        600        6         

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

これら2つのコマンドを定期的に実行する必要があります。

ipcrm -s $(ipcs | grep bob | awk '{printf "%s ",$2}')
ipcrm  shm $(ipcs | grep bob | awk '{printf "%s ",$2}')

それで私もこのようなことができると思いました。

if [ `$(ipcs | grep Shared | awk '{print $2}')` == "Shared"]
ipcrm  shm $(ipcs | grep bob | awk '{printf "%s ",$2}')

$ 2がセマフォに等しくなるまで最初のことをしたいと思います。

if [ `$(ipcs | grep Semaphore | awk '{print $2}')` == "Semaphore"]
ipcrm -s $(ipcs | grep bob | awk '{printf "%s ",$2}'

要約すると、「共有」を見た後、最初のifブロックを実行したいと思います。その後、「セマフォ」を見た後、2番目のifブロックが必要です。

ベストアンサー1

ipcrm shm <ids>私が正しく理解したら、ユーザーbobのすべての共有メモリセグメントでこのコマンドを実行したいと思います。次に、ipcrm -s <ids>ユーザーボブのすべてのセマフォ配列に対するコマンドがあります。

これを行うには、次のコマンドを使用します(スクリプトで繰り返す必要はありません)。

共有メモリセグメント部分の場合:

ipcrm shm $(ipcs -m | awk '$3=="bob" {printf "%s ",$2}')

セマフォ配列部分の場合:

ipcrm -s $(ipcs -s | awk '$3=="bob" {printf "%s ",$2}')

説明する:

ipcsマンページから:

   -m     shared memory segments
   -s     semaphore arrays

ウィジェットは、3番目のフィールドがbobの場合にのみawkIDを印刷します。

おすすめ記事