Bash ungleich String-Vergleich

Bash ungleich String-Vergleich

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

awkDiese 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.

verwandte Informationen