运行单个 for 循环而不是两个 for 循环的更好方法

cok*_*ude 4 bash shell-script

这有效,但我这样做的方式有点愚蠢。有一个更好的方法吗?

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
Run Code Online (Sandbox Code Playgroud)

这就是我运行 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
Run Code Online (Sandbox Code Playgroud)

我需要定期运行这两个命令。

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

所以我想我可以做这样的事情。

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

我想做第一个行为,直到 $2 等于 Semaphore。

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

所以总而言之,我希望在看到“共享”后运行第一个 if 块。然后我想要第二个 if 块,在我看到“信号量”之后。

cha*_*aos 6

如果我理解正确,您想为ipcrm shm <ids>用户 bob 的所有共享内存段运行该命令。然后ipcrm -s <ids>是用户 bob 的所有信号量数组的命令。

要完成此操作,请使用以下命令(您不必在脚本中循环):

对于共享内存段部分:

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

对于信号量数组部分:

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

解释:

ipcs联机帮助页:

   -m     shared memory segments
   -s     semaphore arrays
Run Code Online (Sandbox Code Playgroud)

awk部件仅在第三个字段为 bob 时才打印 ID。