2017-02-18 21 views
0

У меня есть сценарий bash, который вычисляет количество витков Compiz, а затем зависит от этого числа, определяет значения переменных для каждого окна просмотра, чтобы разрешить переход к этому окну просмотра.Переменная значение в имени переменной с использованием bash

wmctrl -d 

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

Этот вывод говорит мне общая площадь видового экрана 19200

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

19200 

и каждый из окна просмотра 3840 в размере

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

3840 

поэтому общее число видовых является 19200/3840 или этот пример 5

Что я сейчас хочу сделать, это заполнить ряд переменных (максимальное общее число r видовых экранов) со значением этого местоположения в окне просмотра. В приведенном выше примере есть 5 видовых так: -

VIEWPORT(1 2 3 4 5) 

3840, 7680, 11520, 15360, 19200 

затем с помощью

wmctrl -o $VIEWPORT(x),0 

(выше отредактированный, чтобы показать, что $ VIEWPORT (х) на самом деле является переменной, я не сделал это ясно изначально, поэтому фактическое значение, скажем, $ VIEWPORT3, было бы 11520, извините, мой плохой в исходном вопросе)

ведет нас к этому окну просмотра.

Вещь, с которой я борюсь, заключается в том, что, поскольку количество переменных требуется, зависит от количества видовых экранов, идентифицированных в начале.

Я немного читал о массивах, но не вижу простого способа использовать массив для выполнения этой работы (мое отсутствие знакомости).

Так что любые предложения относительно того, как это сделать, будут оценены.

+0

Почему не функция вместо переменной? – mouviciel

+0

Использует ли 'wmctrl -o VIEWPORT (2), 0' переход во второй видовой экран или' wmctrl -o VIEWPORT (7680), 0'? –

+0

Я должен был быть более ясным в своем первоначальном описании. wmctrl -o 19200,0 перенесет вас в окно просмотра 5 так, чтобы ответить на ваш вопрос ... wmctrl -o $ VIEWPORT5 (который должен содержать значение 19200), 0 будет таким, каким я пытаюсь это сделать. – anothers

ответ

0

Bash массивы не слишком сложны. Если вы хотите, чтобы переменные использовались позже;

#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 

Теперь у вас будет переменное количество переменных, каждый именованный массив [#]. В вашем примере у вас будет «массив [1]» через «массив [5]», с номерами 3840, 7680, 11520, 15360 и 19200. В дальнейшем, когда вы хотите использовать переменные, вы можете сделать:

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

для получения определенного окна просмотра, где $ x является числом от одного до пяти. Вы можете получить количество индексов в массиве с ${#array[*]}. В этом случае echo ${#array[*]} будет печатать 5.

+0

Зачем использовать 'sed'? все можно сделать с помощью 'awk'. –

+0

Я только что использовал код из вопроса. Могут быть другие или даже лучшие способы разбора строки, но ответ был скорее о том, как построить массив из цикла 'for'. – Guest

+0

@ I'L'I было бы более полезно, если бы вы приводили пример того, как вы будете использовать AWK для этого, а не просто указывать его. Спасибо за отзывы, хотя, – anothers

1

Может быть что-то вроде:

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}') 

Удалить эхо и цитаты, как только ваши счастливые