linux - 如果两台机器上的文件都丢失了,如何退出 shell 脚本?

标签 linux bash shell unix scp

我正在 machineA 上运行 shell 脚本,它将文件从 machineBmachineC 复制到 machineA

如果该文件不在 machineB 中,那么它肯定应该在 machineC 中。因此,我将尝试首先从 machineB 复制,如果 machineB 中不存在,那么我将转到 machineC 复制相同的文件。下面是我的 shell 脚本,我通过它复制文件,PRIMARY_PARTITION 是一个包含所有文件编号的数组 -

for el in "${PRIMARY_PARTITION[@]}"
do
    scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%r@%h:%p' -o ControlPersist=900 david@machineB:/te/data/te_snapshot/20140411/t1_weekly_1680_"$el"_200003_5.data /data01/primary/. || scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%r@%h:%p' -o ControlPersist=900 david@machineC:/te/data/te_snapshot/20140411/t1_weekly_1680_"$el"_200003_5.data /data01/primary/.
done

现在的问题是 - 可能在某些情况下,文件在两台机器中都不存在 - machineBmachineC 然后我想退出具有非零状态和文件丢失的正确消息的 shell 脚本 -

所以我确实这样做了,我在最后添加了另一个管道语句,但不知何故该消息没有在屏幕上打印出来。我非常确定那些尝试复制的文件不存在于这两台机器的那些文件夹中 -

scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%r@%h:%p' -o ControlPersist=900 david@machineB:/te/data/te_snapshot/20140411/t1_weekly_1680_"$el"_200003_5.data /data01/primary/. || scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%r@%h:%p' -o ControlPersist=900 david@machineC:/te/data/te_snapshot/20140411/t1_weekly_1680_"$el"_200003_5.data /data01/primary/. || echo "File number $el missing on both the machines for primary partition." >&2; exit 1

所以它应该转到最后一个管道语句并将其打印在控制台上。对吗?

我在上一个管道语句中做错了什么吗?

最佳答案

根据您的解决方案,它应该有效

scp 仅在成功时返回 0。所以你可以这样写:

scp -q machineB:/path/to/your/file . || scp -q machineC:/path/to/your/file . || echo "Sorry no file found"

现在让我们首先检查每个命令的重新运行代码,如下所示

scp -o ControlMaster=auto -o 'ControlPath=~/.ssh/control-%r@%h:%p' -o ControlPersist=900 david@machineB:/te/data/te_snapshot/20140411/t1_weekly_1680_"$el"_200003_5.data /data01/primary/.

if [[ $? -ne 0 ]]; then
      echo "No file found"
      exit 1
else
     echo "oh..file is here!"
fi

与第二个命令相同。现在,在这两种情况下,如果您获得非零值,那么您的解决方案必须有效。

关于linux - 如果两台机器上的文件都丢失了,如何退出 shell 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23075605/

相关文章:

java - 如何将环境变量添加到 android Runtime.getRuntime().exec 命令中?

c - 如何为数据采集硬件实现 Linux 设备驱动程序?

linux - hackerrank 'Grep' -A 问题解决

linux - 包括 Build Root 的补丁

linux - 如何重用另一个 bash 文件中定义的函数?

linux - Windows 相当于 ">/dev/null &"

Linux shell : prepend or append text to next line after matching line

linux - 用于检查进程是否已在运行并在是时退出的 Shell 脚本

linux - 使用 bash 部署 postgresql - 语法错误

c++ - 我如何确定一个文件对于我在 *nix 上的进程来说是否是只读的?