如何知道循环中的文件是否是最后一个?

Joh*_*ood 17 bash loops

for FILE in $DIR/* 
do
  if(<is last File>)
    doSomethingSpecial($FILE)
  else
    doSomethingRegular($FILE)
  fi
done
Run Code Online (Sandbox Code Playgroud)

要求<is last file>检查当前文件是否是数组中的最后一个文件?

是否有一个简单的内置检查,而不是自己检查阵列的长度?

cda*_*rke 17

要求检查当前文件是否是数组中的最后一个文件?

首先,您没有使用数组.如果你那么这很容易:

declare -a files
files=($DIR/*)
pos=$(( ${#files[*]} - 1 ))
last=${files[$pos]}

for FILE in "${files[@]}"
do 
  if [[ $FILE == $last ]]
  then
     echo "$FILE is the last" 
     break
  else 
     echo "$FILE"
  fi 
done 
Run Code Online (Sandbox Code Playgroud)

  • 我认为当数组中有两个相等的条目时,此解决方案将不起作用。最好迭代索引,即使用“for i in \`seq 0 $pos\”,然后通过“FILE=${files[$i]}”检索文件。 (2认同)

cam*_*amh 9

我知道无法告诉您正在处理for循环中列表的最后一个元素.但是,您可以使用数组,迭代除最后一个元素之外的所有元素,然后处理循环外的最后一个元素:

files=($DIR/*)
for file in "${files[@]::${#files[@]}-1}" ; do
    doSomethingRegular "$file"
done
doSomethingSpecial "${files[@]: -1:1}"
Run Code Online (Sandbox Code Playgroud)

扩展${files[@]:offset:length}计算元素的所有元素offset(从空白开始)length.${#files[@]}-1是数组中元素的数量减去1.

${files[@]: -1:1}计算到最后一个元素 - 从结尾开始的-1,长度为1.空格是必要的,因为:-处理方式不同: -.

  • 从`bash` 4.x开始(不确定是否4.0或更高版本),你可以使用`$ {files [-1]}`而不是`$ {files [@]: - 1:1}`. (3认同)