以下是我的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
我有一个非常简单的问题,在下面提到-
如果我的shell脚本中的以上scp命令由于任何原因使我出现此错误-没有此类文件或目录
然后我需要尝试从machineC进行scp,并且该scp命令将像这样,仅机器会有所不同,其他所有东西都将是相同的-
scp david@machineC:/data/be_t1_snapshot/20131215/t1_$element_5.data /data01/primary/.
所以我的问题是如何在我的shell脚本中检查上述scp命令的输出,然后决定是否需要从machineC调用scp命令?我是否可以使用某种状态检查,如果由于某种原因而失败,那么我可以在machineC上调用scp命令吗?
这可以在shell脚本中完成吗?
解决方法:
干得好:
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
如果操作成功,行为良好的命令将以“成功”(退出代码= 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
如果所有命令均成功,则第一个命令将执行命令链.即使先前的命令失败,第二个命令也将始终执行所有命令.