bash - 在 Bash 的 for 循环中仅运行一次命令

标签 bash for-loop iteration

我有以下来自函数的 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 语句)吗?

最佳答案

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

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

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

我还更改了一些内容:

  • 文件夹而不是FOLDER;大写变量名更有可能与 shell 和环境变量冲突
  • 所有扩展都加引号,以防止分词和通配符([[...]] 中的左侧会自动加引号)
  • 我使用 $folder 而不是 ${folder},但这实际上只是个人品味

关于bash - 在 Bash 的 for 循环中仅运行一次命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53009962/

相关文章:

linux - 如何制作脚本来重命名文件

Bash 变量格式

c# - 变量不持有值(value)

javascript - 如何在不使用 for 循环的情况下迭代 FormDataentries() 数组

python-3.x - 在 Python 3 中自动测试反向字符串

javascript - 迭代 jQuery 格式化 JSON 不正确

linux - 单行异或两个字符串?

linux - 如何忽略(绕过)ssh bash 命令中的 ssh 错误并继续执行命令?

javascript - for循环中无法求和

java - 如何创建处理零计数器的thymeleaf for循环?