【问题标题】:Loop specific Array several times (Bash script)多次循环特定数组(Bash 脚本)
【发布时间】:2022-11-24 00:46:43
【问题描述】:

我对此很陌生,所以我很感激每一个新的提示。我是脚本编写的新手,我想我刚刚获得知识,所以我需要帮助。

我遇到以下情况:

我有一个 Windows 服务器和一个 Oracle Linux 服务器。 Windows Server 有几个目录,里面有一些文件。现在的目标是将文件从每个目录传输到 Linux 服务器上的特定目录中。我想使用 bash 脚本(是的,在 Windows github 上使用 bash 脚本,带有任务调度程序)自动执行此过程。

剧本:

#Files im Ordner des lokalen Servers
array=(
  /c/Users/adbls/Documents/HR/*
  /c/Users/adbls/Documents/Abschluss/*
  /c/Users/adbls/Documents/GL/*
)

#Pfad zu Ordner auf Zielserver
array2=(
  /home/sara.blatter/HR/
  /home/sara.blatter/Abschluss/
  /home/sara.blatter/GL/
)


for index in ${!array[*]}; do

        scp "${array[$index]}" $User@$remoteHost:"${array2[$index]}"
#       rm "${array[$index]}"
done

现在作为一个例子,如果目录“Abschluss”有两个文件,目标路径数组显然不会循环目标路径数组两次,它最终导致文件位于 linux 服务器上的错误目录中.我知道 scp -r 可以用我的通配符解决问题,但我不想复制目标目录中的目录。

我希望你明白我的问题;处理这个问题的最佳方法是什么?

【问题讨论】:

  • 你不能用rsync代替scp吗?
  • 谢谢你的评论,我也有同样的想法!但由于我在 Windows git-bash 上工作,它不支持“rsync”。或者你现在如何将其作为模块导入?
  • 数组之间路径的名称相似性是偶然的还是系统的?在后一种情况下,我将遍历 array2 而不是 array1,并在 scp 命令中执行 globbing (*)。另外,我不会遍历数组指标,而是数组元素。此外,您目前的名称引用表达式 ${!array[*]} 没有意义。你有没有试过用set -x运行你的脚本?
  • 另一种可能性是使用 Cygwin 而不是 git-bash,然后使用 rsync 来完成。这就是我正在使用的。

标签: arrays bash scp


【解决方案1】:

正如您所注意到的,扩展数组中的 glob 会弄乱您的索引。此外,您不能将 glob 存储在变量中并在之后扩展它,至少安全地.

解决方法是在 scp 命令中添加星号:

#!/bin/bash

#Files im Ordner des lokalen Servers
array=(
    /c/Users/adbls/Documents/HR/
    /c/Users/adbls/Documents/Abschluss/
    /c/Users/adbls/Documents/GL/
)

#Pfad zu Ordner auf Zielserver
array2=(
    /home/sara.blatter/HR/
    /home/sara.blatter/Abschluss/
    /home/sara.blatter/GL/
)

for i in "${!array[@]}"
do
    scp -r "${array[i]}"* "$User@$remoteHost:$(printf %q "${array2[i]}")"
done

笔记:printf %q 在这里是因为 scp evals 是远程路径

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 2013-09-17
    相关资源
    最近更新 更多