我怎么能根据最后一个命令的结果来运行不同的命令呢?

例如,有4个文件(A,B,C,D),我尝试用cURL上传,但有时失败。 我的脚本是这样的:

for f in `ls` do curl -T $f ftp.server.com done 

A,B,C成功上传,而D则留下一些错误。 我想要做的是删除A,B,C,只保留目录中的D.

首先,你已经编写了一个bug到你的小脚本中:

 for files in `ls` 

这应该是:

 for files in * 

不同之处在于ls方法不能正确处理名称中带有空格的文件:

 $ ls -l total 8 -rw-r--r-- 1 sarnold sarnold 15 2011-11-23 01:25 bad file drwxr-xr-x 2 sarnold sarnold 4096 2011-11-21 03:07 blubber $ for f in `ls` ; do echo === $f === ; done === bad === === file === === blubber === $ for f in * ; do echo === $f === ; done === bad file === === blubber === $ 

现在,到上传和删除问题:

 for f in * ; do curl -T $f ftp.example.com && rm $f ; done 

&&是一个短路操作员; 只有当第一个命令返回0的退出值(通常意味着在过程返回值“成功” – 是的,稍微向后)时,它才会执行第二个命令。 你也可能有一天找到|| 有用的操作符,如果失败了就执行程序。 也许最令人惊讶的是,你可以在一个命令上使用它们来根据需要在成功或失败上做一些事情:

 $ true && echo success || echo failure success $ false && echo success || echo failure failure $ 

$? 指的是返回码 。 假设“0”表示成功的curl上传,那么你需要这样的东西:

 for files in `ls` do curl -T $f ftp.server.com if [[ $? -eq 0 ]]; then rm $f fi done