如果两台机器中都缺少文件,如何退出shell脚本?

时间:2014-04-15 05:52:06

标签: 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

所以它应该去最后一个管道语句并在控制台上打印出来。正确?

我在上一篇管道声明中有什么不对吗?

1 个答案:

答案 0 :(得分:2)

根据您的解决方案,它应该可行

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

第二个命令相同。现在,如果你得到非零值,那么你的解决方案必须有效。

相关问题