首页 > 解决方案 > 在 Bash 的 for 循环中只运行一次命令

问题描述

我有以下来自函数的 bash 代码模式:

for folder in ${FOLDER[@]}; do
    if [ $# -ne 0 ]; then
        rsync -rvh --delete-after ${folder} ${folder_dest}
    else
        local zipFile=$(stamp-files file.zip)
        unzip -q ${zipFile} "${folder}"*  -d "${folder_src}"
        rsync -rvh --delete-after ${folder_src}${folder} ${folder_dest}
        rsync -rvh --delete-after ${folder_src}${folder} ${folder_dest2}
    fi
done

所以在这个函数中,我在 for 循环中有一个 if 语句。正如您在 else 部分看到的那样,调用了另一个函数stamp-files。仅在第一次迭代中就需要对其他函数的调用,即使它没有引起任何问题,也可以通过调用一次来肯定地改进它。

你知道我怎么能简单地做到这一点并保持这种代码形式(for循环中的if语句)?

标签: bashfor-loopiteration

解决方案


您可以设置一个变量并在第一次迭代中更改它:

first='yes'
for folder in "{folders[@]}"; do
    if [[ $first == 'yes' ]]; then
        local files=$(stamp-files "$folder")
        rsync -rvh --delete-after "$files" "$folder_dest"
        first='no'
    else
        rsync -rvh --delete-after "$folder" "$folder_dest"
    fi
done

您尝试使用的方式$#不起作用:这是位置参数的数量,与迭代次数或类似内容无关。

我也改变了一些东西:

  • folders而不是FOLDER; 大写变量名更容易与 shell 和环境变量发生冲突
  • 引用所有扩展以防止分词和通配(左侧[[...]]自动引用)
  • 我用$folder代替${folder},但这只是个人口味

推荐阅读