【Shell开发】笔记&技巧 - 执行前输出完整命令

228 阅读1分钟

1、需求背景

在编写 shell 脚本时,经常会 在命令参数中插入变量,然后直接执行,

此时如果参数不符合预期,如 多个空格、多个引号,都会导致结果错误,但又很不容易及时发现,

即便是 先把参数都逐个打印,也不易保证其 作为命令参数 最终执行时的值 是符合预期的

2、解决方案

在执行前,先将 准备执行的命令,完整的打印出来,再执行 并返回其结果,具体实现如下:

 # 打印 并执行命令
 function debug_execute() {
     command="$*"
     debug "[debug_execute] $ $command"
     debug_execute_result=$(eval "$command")
 }

2.1、示例1

 # test.sh
 ​
 debug_execute date
 info "$debug_execute_result"

执行结果如下:

图片.png

2.2、示例2

 # test.sh
 ​
 _api_key="9934cd799021db168cacc90c12ae2491"
 curl_url="http://www.pgyer.com/apiv2/app/getCOSToken"
 ​
 debug_execute curl -s -F "_api_key=$_api_key" -F "buildType=ios" $curl_url
 curl_res=$debug_execute_result
 info "curl_res = $curl_res"
 info

执行结果如下:

图片.png

附、debug 输出

在编写 shell 脚本时,使用更语义化 并带有颜色的打印 来代替 echo,无疑可以大大提升开发&使用体验~

 # debug 级别最低,可以随意的使用于任何觉得有利于在调试时更详细的了解系统运行状态的东东;
 function debug() { echo "\033[1;2m[$(date "+%Y/%m/%d %T")] $@\033[0m"; }
 function info() { echo "\033[1;36m[$(date "+%Y/%m/%d %T")] $@\033[0m"; }
 function success() { echo "\033[1;32m[$(date "+%Y/%m/%d %T")] $@\033[0m"; }
 function warn() { echo "\033[1;33m[$(date "+%Y/%m/%d %T")] $@\033[0m"; }
 function error() { echo "\033[1;31m[$(date "+%Y/%m/%d %T")] $@\033[0m"; }
 function fatal() { echo "\033[5;31m[$(date "+%Y/%m/%d %T")] $@\033[0m"; }

使用示例:

 debug "some debug message..."
 info "some info message..."
 success "some success message..."
 warn "some warn message..."
 error "some error message..."
 fatal "some fatal message..."

执行结果如下:

图片.png