在bash中使用递增/递减

时间:2019-01-27 23:56:03

标签: arrays bash

我有一个像这样的bash脚本;

#!/bin/bash

declare -a arr=(
  "arg1x" "arg1y" "arg1z"
  "arg2x" "arg2y" "arg2z"
  "arg3x" "arg3y" "arg3z"
)

while ((i<${#arr[@]})); do
  echo "This should print arg1x: ${arr[i]}"
  echo "This should print arg1x: ${arr[i++]}"
  echo "This should print arg1y: ${arr[i++]}"
  echo "This should print arg1z: ${arr[i]}"
  echo "This should print arg1x: ${arr[i--]}"
  echo "This should print arg1x: ${arr[i]}"
  echo "This should print arg1x: ${arr[i]}"
  echo "This should print arg1z: ${arr[i++]}"
  echo "----------------------------------"
done

应按回显中的说明打印出数组列表(数字无关紧要,但是x, y, z部分应与回显中的字符串匹配)。但是,当我运行脚本时,它会打印出来;

This should print arg1x: arg1x
This should print arg1x arg1x
This should print arg1y arg1y
This should print arg1z arg1z
This should print arg1x arg1z
This should print arg1x arg1y
This should print arg1x arg1y
This should print arg1z arg1y
----------------------------------
This should print arg1x: arg1z
This should print arg1x arg1z
This should print arg1y arg2x
This should print arg1z arg2y
This should print arg1x arg2y
This should print arg1x arg2x
This should print arg1x arg2x
This should print arg1z arg2x
----------------------------------
This should print arg1x: arg2y
This should print arg1x arg2y
This should print arg1y arg2z
This should print arg1z arg3x
This should print arg1x arg3x
This should print arg1x arg2z
This should print arg1x arg2z
This should print arg1z arg2z
----------------------------------
This should print arg1x: arg3x
This should print arg1x arg3x
This should print arg1y arg3y
This should print arg1z arg3z
This should print arg1x arg3z
This should print arg1x arg3y
This should print arg1x arg3y
This should print arg1z arg3y
----------------------------------
This should print arg1x: arg3z
This should print arg1x arg3z
This should print arg1y 
This should print arg1z 
This should print arg1x 
This should print arg1x 
This should print arg1x 
This should print arg1z 
----------------------------------

它将打印5次,而应打印3次,因为数组中只有3个args(对于此示例),另外,args与它们对应的参数不匹配。

我尝试过玩i的东西,但无法弄清楚。

我该怎么做?

更新:

我已经编辑了这样的脚本,现在似乎可以打印出正确的值;

#!/bin/bash

declare -a arr=(
  "arg1x" "arg1y" "arg1z"
  "arg2x" "arg2y" "arg2z"
  "arg3x" "arg3y" "arg3z"
)

while ((i<${#arr[@]})); do
  echo "This should print arg1x: ${arr[i+0]}"
  echo "This should print arg1x ${arr[i+0]}"
  echo "This should print arg1y ${arr[i+1]}"
  echo "This should print arg1z ${arr[i+2]}"
  echo "This should print arg1x ${arr[i]}"
  echo "This should print arg1x ${arr[i]}"
  echo "This should print arg1x ${arr[i]}"
  echo "This should print arg1z ${arr[i+2]}"
  echo "----------------------------------"
done

但是现在它仅循环通过arg1(而不是arg2和3),并且永不停止。

2 个答案:

答案 0 :(得分:1)

我猜您正在尝试遍历数组,也许您想将代码修改为类似这样的内容。

for i in "${arr[@]}"; do
    echo $i
done

*编辑 也许这个吗?

for i in 0 1 2; do
    echo ${arr[$((i * 3 + 0))]}
    echo ${arr[$((i * 3 + 1))]}
    echo ${arr[$((i * 3 + 2))]}
done

答案 1 :(得分:1)

当事情变得如此复杂时,使用++--确实会造成混乱。一方面,您必须确保增量是减量的3倍。您有3个增量和1个减量,因此净值只有2个增量,因此每次迭代都减一(这就是为什么它在第一次迭代后就消失了)。其次,您必须仔细跟踪每个点的位置,以弄清楚是否要获得x,y或z。仅在循环本身中增加+3,然后对x使用[i],对于y使用[i+1],对于z使用[i+2]会容易得多。由于这些内容不会改变i,因此无论您使用它们多少次和使用什么顺序,它们都可以起作用

declare -a arr=(
  "arg1x" "arg1y" "arg1z"
  "arg2x" "arg2y" "arg2z"
  "arg3x" "arg3y" "arg3z"
)

for ((i=0; i<${#arr[@]}; i+=3)); do    # Iterate the array, 3 at a time
  echo "This should print arg(something)x: ${arr[i]}"
  echo "This should print arg(something)x: ${arr[i]}"
  echo "This should print arg(something)y: ${arr[i+1]}"
  echo "This should print arg(something)z: ${arr[i+2]}"
  echo "This should print arg(something)x: ${arr[i]}"
  echo "This should print arg(something)x: ${arr[i]}"
  echo "This should print arg(something)x: ${arr[i]}"
  echo "This should print arg(something)z: ${arr[i+2]}"
  echo "----------------------------------"
done
相关问题