2017-02-18 6 views
0

Ich habe ein Bash-Skript, das die Anzahl der Compiz-Ansichtsfenster berechnet und abhängig von dieser Anzahl Variablenwerte für jedes Ansichtsfenster definiert, um den Sprung zu diesem Ansichtsfenster zu ermöglichen.Variablenwert im Variablennamen mit bash

wmctrl -d 

0 * DG: 19200x2160 VP: 0,0 WA: 0,38 3840x2084 Workspace 1 

Dieser Ausgang sagt mir die Gesamtfläche Ansichtsfenster 19200

wmctrl -d | awk '{print $4}' | sed -e 's/x..*//' 

19200 

und jedes Ansichtsfenster 3840 in Größe

wmctrl -d | awk '{print $9}' | sed -e 's/x..*//' 

3840 

daher die Gesamtzahl der Ansichtsfenster ist 19200/3840 oder in Diese Instanz 5

was ich jetzt tun möchte, ist eine Anzahl von Variablen auffüllen (maximale Gesamtanzahl r der Ansichtsfenster) mit dem Wert dieser Ansichtsfensterposition. In dem obigen Beispiel gibt es 5 Ansichtsfenster so: -

VIEWPORT(1 2 3 4 5) 

3840, 7680, 11520, 15360, 19200 

dann

mit
wmctrl -o $VIEWPORT(x),0 

(Above editierten zu zeigen, dass $ ANSICHTSFENSTER (x) ist eigentlich eine Variable, machte ich es nicht klar ursprünglich, also der tatsächliche Wert von sagen $ VIEWPORT3 wäre 11520, sorry mein schlechtes in der ursprünglichen Frage)

bringt uns zu diesem Ansichtsfenster.

Die Sache, mit der ich mich bemühe, ist, dass die Anzahl der erforderlichen Variablen von der Anzahl der zu Beginn identifizierten Ansichtsfenster abhängt.

Ich habe ein wenig über Arrays gelesen, kann aber keinen einfachen Weg sehen, ein Array zu verwenden, um diese Arbeit zu machen (mein Mangel an Vertrautheit).

So alle Vorschläge, wie dies zu tun wäre, würden geschätzt.

+0

Warum nicht eine Funktion anstelle einer Variablen? – mouviciel

+0

Führt 'wmctrl -o VIEWPORT (2), 0' zum zweiten Ansichtsfenster oder tut' wmctrl -o VIEWPORT (7680), 0'? –

+0

Ich hätte vielleicht in meiner ursprünglichen Beschreibung klarer sein sollen. wmctrl -o 19200,0 würde Sie zum Viewport 5 so auf Ihre Frage zu beantworten ... wmctrl -o $ VIEWPORT5 (die den Wert 19200 enthalten sollte), 0 wäre die Art, wie ich es versuche. – anothers

Antwort

0

Bash-Arrays nicht zu komplex ist. Wenn Sie die Variablen später verwenden möchten;

#Total Viewport Area 
totview=$(wmctrl -d | awk '{print $4}' | sed -e 's/x..*//') 
#Each Viewport size 
viewsize=$(wmctrl -d | awk '{print $9}' | sed -e 's/x..*//') 

#Loop as many times as totview/viewsize equals 
for ((i=1;$i<=$(($totview/$viewsize));i++)); do 
    array[$i]=$(($viewsize * $i)) #sets the array entry at index $i to the next viewsize. Remember that $i increases by one every loop 
done 

Jetzt haben Sie eine variable Anzahl von Variablen, jedes benannte Array [#]. In Ihrem Beispiel würden Sie "array [1]" bis "array [5]" mit den Nummern 3840, 7680, 11520, 15360 und 19200 haben. Später, wenn Sie die Variablen verwenden möchten, können Sie Folgendes tun:

wmctrl -o VIEWPORT(${array[$x]}),0 

einen bestimmten Ansichtsfenster zu bekommen, mit $ x eine Zahl von eins bis fünf ist. Sie können die Anzahl der Indizes in Array mit ${#array[*]} abrufen. In diesem Fall würde echo ${#array[*]} drucken 5.

+0

Warum verwenden Sie 'sed' überhaupt? alles kann mit 'awk' gemacht werden. –

+0

Ich habe nur den Code aus der Frage verwendet. Es gibt möglicherweise andere oder sogar bessere Möglichkeiten, einen String zu parsen, aber die Antwort war mehr, wie man ein Array aus einer 'for'-Schleife erstellt. – Guest

+0

@ I'L'I es wäre nützlicher, wenn Sie ein Beispiel geben würden, wie Sie AWK verwenden würden, um es zu tun, anstatt es nur anzugeben. Danke für das Feedback, – anothers

1

Vielleicht so etwas wie:

while read -r size 
do 
    echo "wmctrl -o VIEWPORT($size),0" 
done< <(wmctrl -d | awk -F'[ x]' '{for(i = $10; i <= $4; i += $10)print i}') 

Entfernen Sie das Echo und Zitate, sobald Sie glücklich

Verwandte Themen