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