Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使用bash的变量名中的变量值_Arrays_Bash_Variables - Fatal编程技术网

Arrays 使用bash的变量名中的变量值

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

我有一个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 -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)