这可能是一个愚蠢的问题,更多是出于好奇。我在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”方法来做,并想知道我是如何错误地思考这个问题的。任何指针都表示赞赏。
谢谢! 丹
答案 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