下面是我的shell脚本片段,我在其中执行scp命令将文件从machineB复制到machineA。
for element in ${x[$key]}; do # no quotes here
printf "%s\t%s\n" "$key" "$element"
if [ $key -eq 0 ]
then
scp david@machineB:/data/be_t1_snapshot/20131215/t1_$element_5.data /data01/primary/.
fi
done我有一个非常简单的问题,如下所述-
如果我的外壳脚本中的上面的scp命令由于某种原因- No such file or directory给了我这个错误,那么我需要尝试从machineC执行scp,对于这个scp命令将是这样的,只有机器是不同的,其他的都是一样的-
scp david@machineC:/data/be_t1_snapshot/20131215/t1_$element_5.data /data01/primary/.所以我的问题是,如何在我的shell脚本中检查上述scp命令的输出,然后决定是否需要从machineC调用scp命令?是否有任何状态类型的东西,我可以用来检查,如果它失败了,无论是什么原因,我可以调用machineC上的scp命令?
这可以在shell脚本中实现吗?
发布于 2013-12-17 14:16:09
这就是了:
for element in ${x[$key]}; do # no quotes here
printf "%s\t%s\n" "$key" "$element"
if [ $key -eq 0 ]
then
scp david@machineB:/data/be_t1_snapshot/20131215/t1_$element_5.data /data01/primary/. || scp david@machineB:/data/be_t1_snapshot/20131215/t1_$element_5.data /data01/primary/
fi
done如果操作成功,行为良好的命令将以"success“(退出代码= 0)退出,否则将以退出代码!= 0退出。您可以像这样将命令链接在一起:
cmd && echo successful || echo failed
cmd && keep going || do something else退出代码也存储在$?变量中,因此这是等效的:
cmd; if $? = 0; then echo successful; else echo failed; fi不仅如此,命令的状态码在shell脚本中也非常重要。考虑以下两个示例:
./configure && make && make install
./configure; make; make install如果所有操作都成功,则第一个命令将执行命令链。第二个命令将始终执行所有这些命令,即使前面的命令失败。
发布于 2013-12-17 14:24:15
scp只有在成功后才返回0。所以你可以这样写:
scp machineB:/path/toyourfile .
if [ $? -ne 0 ]
then
scp machineC:/path/to/your/file .
fi一种更短的方法是:
scp machineB:/path/toyourfile .
[ $? -eq 0 ] || scp machineC:/path/to/your/file .或
scp machineB:/path/toyourfile .
[ $? -ne 0 ] && scp machineC:/path/to/your/file .就我个人而言,我更喜欢更短的方法,scp输出在脚本中没有任何用处:
scp -q machineB:/path/to/your/file . || scp -q machineC:/path/to/your/file .并且记住使用${element}而不是$element
https://stackoverflow.com/questions/20627207
复制相似问题