如何使用数组长度分配范围?

时间:2016-12-21 17:29:02

标签: arrays bash

这可能是一个愚蠢的问题,更多是出于好奇。我在bash中有一个数组:

array=(name1.ext name2.ext name3.ext)

我想从每个元素中剥离扩展。我试图通过循环遍历每个元素来做到这一点,但是我在设置循环的范围时遇到了麻烦(见下文):

for i in 'echo {0..'expr ${#array[@]} - 1'}'; do newarray[$i]+=$(echo "${array[$i]:0:5}"); done

请注意代码块中的'=“后退”,因为我不知道如何逃避它。

我无法使用设定范围(例如seq 0 3),因为它会根据文件夹而改变,所以我希望能够使用数组的长度减1.我能够工作围绕这个使用:

for (( i=0; i<${#array[@]}; i++ )); do newarray[$i]+=$(echo "${array[$i]:0:5}"); done

但我认为应该有一些方法可以用上面的“数组长度减1”方法来做,并想知道我是如何错误地思考这个问题的。任何指针都表示赞赏。

谢谢! 丹

3 个答案:

答案 0 :(得分:2)

使用Bash,您可以使用${files[@]}

简单地遍历数组元素
#!/bin/bash
files=(name1.ext name2.ext name3.ext)

for f in ${files[@]}; do
  echo "${f%.*}"
done

如果你有不同长度的扩展名,那么子串删除${f%.*}也是更好的选择。

答案 1 :(得分:1)

您可以直接将各种参数扩展运算符应用于数组的每个元素,而无需显式循环。

$ array=(name1.ext name2.ext name3.ext)
$ printf '%s\n' "${array[@]%.ext}"
name1
name2
name3
$ newarray=( "${array[@]%.ext}" )

但是,一般情况下,几乎不需要生成一个范围数来迭代。只需使用C风格的for循环:

for ((i=0; i< ${#array[@]}; i++ )); do
    newarray[$i]="${array[i]%.ext}"
done

答案 2 :(得分:0)

您可以使用seq命令

for i in `seq 0 $(( ${#array[@]} - 1 ))`
do 
      ···
done

或bash大括号扩展(但在这种情况下,你需要eval):

for i in `eval echo {0..$(( ${#array[@]} - 1 ))}`
do 
      ···
done

但还有另外一个更好(甚至在稀疏数组中也能正常工作):让bash为我们提供数组索引

for i in ${!array[@]}
do 
      ···
done