GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

Ist eine For-Schleife mit Arrays besser als die Feldaufteilung einer einfachen Variablen?

Ich habe mehrere Bewerbungen offen. Ausführen von wmctrl und die Ausgabe an awk weiterleiten listet die Fenster-IDs (mit Ausnahme von „klebrigen“ Fenstern) wie folgt auf:

$ wmctrl -l | awk ' !/-1/ { print $1 } '
0x00a00018
0x04800005
0x04e00005
0x04400003
0x05000003
0x0540002b
0x05a00012
0x05800002
0x05c00003
$ 

Ich kann diese Ausgabe an wmctrl senden um alle diese Fenster zu schließen:

  • Fenster ohne Inhalt, die gespeichert werden müssen, und Fenster, die keine Antwort benötigen, werden geschlossen, ohne mich zu fragen, aber

  • Fenster wie die von Redakteuren mit nicht gespeicherten Inhalten oder Terminals, auf denen ein Prozess läuft, werden „ordentlich“ geschlossen:Die jeweilige Anwendung zeigt ein Fenster an, in dem ich Änderungen speichern oder verwerfen oder mich über einen noch laufenden Prozess informieren kann.

Das folgende Skript, das einem geeigneten Shortcut zugeordnet ist, funktioniert:

#!/bin/bash

list=$(wmctrl -l | awk ' !/-1/ { print $1 } ')

for i in ${list[@]}
do
    wmctrl -i -a $i
    wmctrl -i -c $i
done

Ich fand das einfacher (für mich) for i in $list geht auch.

Gibt es einen Grund, das eine dem anderen vorzuziehen?

„sticky“ und „gracefully“ sind Begriffe aus man wmctrl .

Akzeptierte Antwort:

In Ihrem Skript $list ist dasselbe wie ${list[@]} .

Letzteres ist eine Array-Syntax, aber in Ihrem Skript ist es eine normale Variable.

Da Sie keine Leerzeichen in Ihrem wmctl haben Ausgabeelemente benötigen Sie kein Array und verwenden Sie $list ist vollkommen in Ordnung.

Wenn es war ein Array, $list wäre nur das erste Element des Arrays (=> item1 ) und ${list[@]} würde sich auf alle Artikel erstrecken (=> item1 item2 item3 ).

Aber was du wirklich wolltest, wenn es tatsächlich war ein Array ist "${list[@]}" (mit Anführungszeichen), die bis zu "item1" "item2" "item3" reicht , damit es nicht an Leerzeichen erstickt.

(Lesen)


Ubuntu
  1. [Linux]:Netzwerkprobleme mit MTR diagnostizieren – besser als Traceroute!

  2. Linux vs. Windows:Welches Betriebssystem ist besser für PC-Spiele?

  3. Wmctrl dazu bringen, andere als aktuelle Workspace-Windows zu ignorieren?

  4. Gibt es etwas Besseres als Käse für die Videoaufnahme?

  5. Variable im Befehlspfad für ExecStart im systemd-Dienst verwenden

Bash For-Schleifen mit Beispielen

Verwenden von Keepalived zum Verwalten eines einfachen Failover in Clustern

So installieren Sie Windows 11 auf Ubuntu 20.04 mit VirtualBox

So installieren Sie das Windows-Subsystem für Linux

Verwendung von „${a:-b}“ für die Variablenzuweisung in Skripten?

Verwenden von Ubuntu 18.04 im erweiterten Modus für Hyper-V unter Windows 10