Arrays 使用bash的变量名中的变量值
我有一个bash脚本,它计算Compiz视口的数量,然后根据该数量为每个视口定义变量值,以允许跳转到该视口Arrays 使用bash的变量名中的变量值,arrays,bash,variables,Arrays,Bash,Variables,我有一个bash脚本,它计算Compiz视口的数量,然后根据该数量为每个视口定义变量值,以允许跳转到该视口 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
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
我现在要做的是用视口位置的值填充许多变量(最大视口总数)。在上面的示例中,有5个视口,因此:-
VIEWPORT(1 2 3 4 5)
3840, 7680, 11520, 15360, 19200
然后使用
wmctrl -o $VIEWPORT(x),0
(上面的编辑显示$VIEWPORT(x)实际上是一个变量,我最初没有明确说明,所以$VIEWPORT 3的实际值应该是11520,对不起,我在原始问题中的错误)
带我们到那个视口
wmctrl -d
0 * DG: 19200x2160 VP: 0,0 WA: 0,38 3840x2084 Workspace 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}')
读取时-r大小
做
echo“wmctrl-o视口($size),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
获取特定视口,其中$x是一个从1到5的数字。您可以使用${#array[*]}
获取数组中的索引数。在这种情况下,echo${#array[*]}
将打印5。为什么不使用函数而不是变量?是wmctrl-o视口(2),0
将您带到第二个视口,还是wmctrl-o视口(7680),0
?在我最初的描述中,我应该更清楚一些。wmctrl-o 19200,0将带您到视口5,以便回答您的问题。。。wmctrl-o$VIEWPORT5(应该包含值19200),0将是我尝试的方式。为什么要使用sed
?一切都可以用awk
完成。我只是用了问题中的代码。可能还有其他甚至更好的方法来解析字符串,但答案更多的是关于如何从for
循环构建数组。@I'L'I如果您给出一个示例,说明如何使用AWK来解析字符串,而不是仅仅说明它,那会更有用。不过谢谢你的反馈,谢谢客人,就这样做了。我在代码中将名称从array改为更容易记住的名称,但主要的工作原理很好。我最终的结果是。。。。对于((i=1;$i)