输出结果来自正在运行的.sh脚本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了输出结果来自正在运行的.sh脚本相关的知识,希望对你有一定的参考价值。

如果我有一个包含以下脚本代码的基本.sh文件:

#!/bin/sh
rm -rf "MyFolder"

如何使此运行脚本文件向终端显示结果,以指示目录删除是否成功?

答案

如果您询问一般情况,如问题标题所示,您可以使用sh -x scriptname运行脚本以查看它正在执行的操作。将诊断输出写入脚本本身并使用选项控制它也很常见。

#!/bin/sh
verbose=false
case $1 in -v | --verbose )
    verbose=true
    shift ;;
esac

say () 
    $verbose || return
    echo "$0: $@" >&2


say "Removing $dir ..."
rm -rf "$dir" || say "Failed."

如果您在没有任何选项的情况下运行此脚本,它将以静默方式运行,就像一个表现良好的Unix实用程序一样。如果使用-v选项运行它,它将打印一些诊断到标准错误。

另一答案
rm -rf "My Folder" && echo "Done" || echo "Error!"

您可以阅读有关创建一系列管道in bash manual的更多信息

另一答案

在bash(和其他类似的shell)中,?环境变量为您提供上次执行的命令的退出代码。所以你可以这样做:

#!/bin/sh
rm -rf "My Folder"
echo $?

UPDATE

如果执行了rm命令后该目录不存在(因为它已成功删除,或者因为执行该命令时它不存在),脚本将打印0.如果该目录存在(这意味着命令已无法删除它)然后脚本将打印除0以外的退出代码。如果我正确理解这个问题,这正是请求的行为。如果不是,请纠正我。

另一答案

之前的答案是错误的:当dir不存在时,rm不会以错误代码> 0退出。

相反,我建议使用:

dir='/path/to/dir'
if [[ -d $dir ]]; then
    rm -rf "$dir"
fi

如果您希望rm返回状态,请删除-f标志。

Linux Mint上的示例(目录不存在):

$ rm -rf /tmp/sdfghjklm
$ echo $?
0

$ rm -r /tmp/sdfghjklm
$ echo $?
1

以上是关于输出结果来自正在运行的.sh脚本的主要内容,如果未能解决你的问题,请参考以下文章

shell 脚本 变量 获取程序输出结果异常分析

编写shell脚本不停地telnet一个ip或域名,并输出结果到文件中

Nohup后台运行程序

如何在shell脚本中调用另一个shell的结果

怎么把shell后台输出赋值给变量

怎么把shell后台输出赋值给变量