将Bash循环内的Integer转换为Variable

时间:2014-01-04 09:31:50

标签: bash sh

我有一个Bash脚本:

How would I loop through a list of numbered variables and then make the variable into a loop.

Example:

//Variables
DIR="/home/"
LIMIT=8
1="cupcake/"
2="cake/"
3="icecream/"
4="donut/"
5="cocoa/"
6="whipcream/"
7="cookie/"
8="coffee/"

for i in {1..8} // The number of variables
do
  cd "$DIR${i}"; // cd /home/cupcake/
  make something;
done

4 个答案:

答案 0 :(得分:1)

我假装你的编号变量是参数。这就是编号变量的用途。

for i in {1..8} // The number of variables
do
  eval cd "$DIR\${$i}"; // cd /home/cupcake/
  make something;
done

但是,如果这确实是参数,您可以安全地使用$1并继续转移,直到您引用它们为止。

for i in {1..8} // The number of variables
do
  cd "$DIR$1"; // cd /home/cupcake/
  make something;
  shift
done

您可以检查传递的参数数量for {1..8},而不是使用$#

while [ $# -gt 0 ] // The number of variables
do
  cd "$DIR$1"; // cd /home/cupcake/
  make something;
  shift
done

答案 1 :(得分:1)

两种方式是合理的。

使用位置参数:

set "cupcake" "cake" "icecream" "donut" "cocoa" "whipcream" "cookie" "coffee"

for i; do
    cd "${DIR}/${i}" || continue
    # do something
done

在变量中存储路径的最终斜杠不是自定义的,因此我使用"${DIR}/${i}"。无论如何,cd /home//cupcake不会失败。

或使用数组:

A=( "cupcake" "cake" "icecream" "donut" "cocoa" "whipcream" "cookie" "coffee" )

for i in "${A[@]}"; do
    cd "${DIR}/${i}" || continue
    # do something
done

请注意,您应该使用"${A[@]}"来正确处理空格,而不是${A[*]}。如果|| continue失败,cd会中断当前迭代。

数组显然更灵活:您可以在问题中尝试明确设置位置

A=(
    [1]="cupcake"
    [7]="cookie"
    [2]="cake"  
    [3]="icecream"
    [4]="donut"
    [6]="whipcream"
    [5]="cocoa"
    [8]="coffee"
)

稍后编辑任何单个元素

A[4]="doughnut"

删除任何元素

unset A[4]

等等。

答案 2 :(得分:0)

你做不到。编号变量保留用于脚本/函数参数。重命名。

答案 3 :(得分:0)

我怀疑你想要an array,它也允许for循环,虽然它看起来更像

for subdir in ${dirarray[*]}
do
    cd "$DIR$subdir";
    make something;
done