Warum verursacht dies eine Endlosschleife?
#!/bin/bash
while [[ "$(ipcs | awk '{print $2}')" != "Semaphore" ]]; do
#Gonna get rid of the echo after working
echo "$(ipcs | awk '{print $2}')"
#I want to keep this
ipcrm shm "$(ipcs | awk '{print $2}')"
#I want this run after breaking out of the loop until I reach the string
#Message.
ipcrm -s "$(ipcs | awk '{print $2}')"
done
echo
exit 0
Ich habe überprüft, dass ich schließlich Semaphore bekomme, sodass es aus der While-Schleife ausbrechen sollte.
$ echo $(ipcs | awk '{print $2}')
Shared shmid 262145 294914 2326531 Semaphore semid Message msqid
$ ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 262145 bob 600 393216 2 dest
0x00000000 294914 bob 600 393216 2 dest
0x00000000 2490371 bob 600 998400 2 dest
------ Semaphore Arrays --------
key semid owner perms nsems
------ Message Queues --------
key msqid owner perms used-bytes messages
$ echo $(ipcs | awk '{print $1}')
------ key 0x00000000 0x00000000 0x00000000 ------ key ------ key
$ echo $(ipcs | awk '{print $2}')
Shared shmid 262145 294914 2490371 Semaphore semid Message msqid
Antwort1
$(ipcs | awk '{print $2}')
ist nie gleich Semaphore
. Es ist immer gleich:
Shared shmid 262145 294914 2326531 Semaphore semid Message msqid
Sie möchten wahrscheinlich etwas wie:
for e in $(ipcs | awk '{print $2}'); do
[[ "$e" = "Semaphore" ]] && break
echo $e
done
echo
exit 0
awk
Diese Lösung könnte Ihnen auch gefallen :
ipcs | awk '$2 == "Semaphore" {exit;} $2 != "" {print $2}'
Eine kleine Erklärung:
- Wenn das zweite FeldSemaphor, Ausfahrt.
- Andernfalls, wenn dieses Feld nicht leer ist, drucken Sie es.
Hier sind einige alternative Lösungen (vorausgesetzt, ich habe Ihre Anforderungen hier verstanden):
# List all shared memory segments keys
ipcs -m | awk 'NR > 3 && $1 != "" {print $1}'
# List all shared memory segments IDs
ipcs -m | awk 'NR > 3 && $2 != "" {print $2}'
Für jedes dieser Beispiele können Sie über das Ergebnis iterieren:
for e in $(above command); do
echo $e
done
Antwort2
Hier ist eine etwas andere Möglichkeit, Ihre While-Schleife anzugehen:
$ while read line; do
echo "$line";
if [[ "$line" != *Semaphore* ]]; then
echo "not semaphore";
else
echo "is semaphore";
fi;
done < <(ipcs | awk '{print $2}')
Das Ergebnis ist folgende:
...
not semaphore
814972976
not semaphore
815005745
not semaphore
817070167
not semaphore
not semaphore
Semaphore
is semaphore
semid
not semaphore
Beachten Sie, dass die Zeichenfolge „Semaphore“ ordnungsgemäß identifiziert wird, wenn sie erreicht wird.