我有以下来自函数的 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/