【SRE应该掌握的利器】提高Shell脚本质量的利器:ShellCheck

发布于:2024-10-24 编辑:匿名 来源:网络

在Linux系统中,Shell脚本是自动化任务的关键工具,对于提高工作效率具有重要意义。然而,编写无错误且高效的 shell 脚本对于新手来说可能是一个挑战,因为很容易忽视一些常见的错误和漏洞。

幸运的是,ShellCheck作为一个静态分析工具,可以帮助我们发现并改善这些问题。图片 ShellCheck简介 ShellCheck是一个开源的静态分析工具,专门用于分析Shell脚本。

它可以自动检测脚本中的各种问题,包括但不限于语法错误、逻辑漏洞、编码风格问题以及可能的安全风险。 ShellCheck不仅能识别问题,还能提供改进建议,帮助SRE快速定位并修复问题。

ShellCheck安装指南 ShellCheck支持多种安装方式,包括包管理器、源码编译、Docker容器等。对于大多数 Linux 发行版,通过包管理器安装是最简单的方法。

以Ubuntu为例,安装ShellCheck的命令如下: 代码语言:javascript copy sudo apt-get update sudo apt-get install shellcheck 安装后,只需在命令行输入shellcheck即可启动该工具。为了提高易用性,可以将 ShellCheck 添加到环境变量中或配置为代码编辑器的插件。

在编辑器中集成ShellCheck ShellCheck的集成对于提高开发效率和代码质量至关重要。在不同编辑器中集成 ShellCheck 的指南:Vim 在 Vim 中,有几个插件可以帮助集成 ShellCheck: ALE (异步 Lint Engine):提供异步语法和代码检查。

Neomake:多种语言的异步构建系统和静态分析工具的聚合器。 Syntastic:另一个提供多种语言语法检查的插件。

Emacs 对于 Emacs 用户,以下是集成 ShellCheck 的选项: Flycheck:Emacs 的现代语法检查器。 Flymake:传统的 Emacs 插件,用于实时语法检查。

Sublime Text 在 Sublime Text 中,您可以使用 SublimeLinter 插件来集成 ShellCheck,这是一个强大的代码检查框架。 Atom编辑器可以通过Linter插件集成ShellCheck,支持多种语言的语法检查。

VSCode 对于 Visual Studio Code 用户,您可以安装 vscode-shellcheck 扩展来集成 ShellCheck,它将提供内联语法和代码检查。通过将ShellCheck集成到我们的编辑器中,我们可以在编写shell脚本时得到即时反馈,从而更快地发现和修复潜在的问题,从而提高我们的开发效率和代码质量。

ShellCheck的使用实践让我们通过一个具体的案例来展示ShellCheck的实际应用。假设我们有以下 shell 脚本示例: 代码语言:javascript copy #!/bin/bashecho "输入一个数字:"read numif [ $num -gt 10 ]; then echo "Number is greater than 10"else echo "Number is not Greater than 10"fi 当我们使用ShellCheck检查这个脚本时,会发现一个常见的问题:测试表达式中,[和]之间不能有空格,否则会造成逻辑错误。

ShellCheck 将输出以下警告消息: Code language: javascript copy shellcheck test.sh In test.sh line 4: read num^--^ SC(info): read without -r will mangle backslashes.In test.sh line 6:如果 [ $num -gt 10 ];然后 ^--^ SC(info): 双引号以防止通配和分词。您的意思是: if [ "$num" -gt 10 ];那么更多信息: -- 双引号以防止通配... -- read without -r will mangle backs... 通过这个简单的例子,我们可以看到ShellCheck如何帮助SRE快速定位问题并修复它们。

常见问题 ShellCheck 是一个shell 脚本的静态分析工具。它可以检查并报告各种常见问题,帮助SRE提高脚本的质量和安全性。

下面是 ShellCheck 可以识别的一些问题的分类列表: 引用 ShellCheck 可以识别几种类型的错误引用: 代码语言:javascript copy echo $1 # Unquoted Variables #Variables 没有引用 find。 -name *.ogg # Unquoted find/grep Pattern #find/grep 的匹配模式不带引号 rm "~/my file.txt" # Quoted tildeexpansion #引号内的波浪号扩展 v='--verbose="真的”'; cmd $v # 变量中的文字引号 # 变量中的文字引号 for f in "*.ogg" # 错误引用的 'for' 循环 # 错误的 for 循环 touch $@ # 未加引号的 $@ # $@ 未加引号 echo 'Don't忘记重新启动! # 单引号由撇号关闭 # 单引号意外地被撇号关闭 echo 'Don\'t try this at home' # Attempting to escape ' in '' #Attempting to add a single quote to thepart of 单引号 echo ' Path is $PATH' # 单引号中的变量 # 单引号内的变量 trap "echo Take ${SECONDS}s" 0 # 过早扩展的陷阱 #过早扩展的陷阱 条件 ShellCheck 可以识别多种类型的错误测试语句。

代码语言:javascript copy [[ n != 0 ]] # 常量测试表达式 # 常量测试表达式 [[ -e *.mpg ]] # glob 的存在性检查 # 检查文件是否存在时,使用通配符 [[ $ foo= =0 ]] # 由于缺少空格,始终为真 # 由于缺少空格,结果始终为真 [[ -n "$foo " ]] # 由于文字,始终为真 # 由于存在 ,结果始终为真文字值 [[ $foo =~ "fo+" ]] # =~ 中引用的正则表达式 # =~ 中使用正则表达式 [ foo =~ re ] # 不支持的 [ ] 运算符 # 不支持的 [] 运算符 [ $1 -eq " shellcheck" ] # 字符串的数字比较 # 比较数字和字符串 [ $n && $m ] # && in [ .. ] # 在 [] 中使用 && 运算符 [ grep -q foo file ] # 不带 $(. .) 的命令 # 该命令ismissing $(..)[[ "$$file" == *.jpg ]] # 无法成功的比较 # 无法成功比较 (( 1 -lt 2 )) # 在 ((.. )) #使用((..))中经常被误用的命令ShellCheck来识别不正确的命令用法: 代码语言:javascript 复制 grep '*foo*' 文件 # 正则表达式上下文中的 Globs #在 grep 的正则表达式查找之前和之后使用通配符。 -exec foo {} && bar {} \; # 提前终止 find -exec # 让 find -exec 提前结束 sudo echo 'Var=42' > /etc/profile # 重定向 sudo # 重定向 sudotime --format=%s sleep 10 # 将 time(1) 标志传递给内置时间# 将 time(1) 的标志传递给内置函数 内置 timewhile read h; do ssh "$h" uptime # 命令吃 while 循环输入 # 在获取输入的 while 循环中,使用也将获取输入的命令别名 archive='mv $1 /backup' # 使用参数定义别名 # 使用参数定义别名 - cd '[a-zA-Z0-9]' # [] around range in tr # 在 tr 的参数范围之外使用 []exec foo;回声“完成!” # 误用 'exec' # 错误使用 execfind -name \*.bak -o -name \*~ -delete # find 中的隐式优先级 # find 中的隐式优先级 # find . -exec foo > 酒吧 \; # find 中的重定向 # find 中的重定向 Redirect f() { whoami; }; sudo f # 外部使用内部函数# 初学者在外部使用内部函数时常见的错误 ShellCheck 可以识别很多初学者常见的语法错误: 代码语言:javascript Copy var = 42 # 赋值中 = 周围的空格 # 等号两边的空格 $foo=42 # 赋值中的 $ # 在 * 中使用 $for $var; do... # $ in for 循环变量 # 在循环变量中使用 $var$n="Hello" # 错误的间接赋值 #错误的变量 echo ${var $n} # 错误的间接引用 #错误的引用 var=(1, 2 , 3) # 逗号分隔数组 #逗号分隔数组 array=( [index] = value) # 索引初始化不正确 #索引初始化错误 echo $var[ 14] # 数组引用中缺少 {} # 引用数组缺少 {} echo "Argument 10 is $10" # 位置参数错误引用 #位置参数引用错误 if $(myfunction);然后 ..; fi # 将命令包装在 $() 中 #添加 $()else if othercondition; then .. # 使用 'else if' #Use else iff; f() { echo "hello world; } # 在定义之前使用函数 在函数定义之前使用函数 [false ] # 'false' 为 true # 这里 false 为 true if (-f file) # 使用 (..) 代替 test #使用 () 代替测试条件样式 ShellCheck 可以提出改进样式的建议: 代码语言: javascript copy [ [ -z $(find /tmp | grep mpg) ]] # 使用 grep -q 代替 #改为使用 grep -qa >> log; b >> 日志; c >> log # 使用重定向块 #更改为使用重定向块 echo "The time is `date`" # 使用 $() 代替 #更改为使用 $()cd dir;过程 *;光盘 ..; # 使用 subshel??ls 代替 #更改为使用 subshel??lecho $[1] # 使用标准 $((..)) 代替旧的 $[] #更改为使用标准 $((..))echo $(($RANDOM % 6) ) # 不要在 $((..)) 中的变量上使用 $ #不要在 $((..)) 中使用 $echo "$(date)" # 无用的 echo # 不必要的 echocat 文件 | grep foo # 无用的使用 cat # 不必要的 cat 数据并输入错误 ShellCheck 可以识别与数据和输入相关的问题: 代码语言: javascript Copy args="$@" # 将数组分配给字符串 # 将数组分配给字符串文件s=(foo 栏); echo "$files" # 将数组作为字符串引用 # 将数字引用作为字符串声明 -A arr=(foo bar) # 不带索引的关联数组 # 不带索引的组合数组 printf "%s\n " "Arguments: $@." # 连接字符串和数组 # 连接字符串和数组 [[ $# > 2 ]] # 将数字与字符串进行比较 # 将数字与字符串进行比较 var=World; echo "Hello " var # 未使用的小写变量 # 未使用的小写变量 echo "Hello $name" # 未分配的小写变量 # 未分配的小写变量 cmd |阅读栏; echo $bar # 子 shell 中的赋值 # 子 shell 中的赋值 cat foo | cp bar # 管道传输到不读取的命令 # 通过管道将数据传递到不读取的程序 printf '%s: %s\n' foo # printf 参数不匹配 count # pirintf 参数的数量不匹配ShellCheck 的稳健性。

可以进行改进 脚本稳健性建议: 代码语言:javascript copy rm -rf "$STEAMROOT/"* # 灾难性 rm # rmtouch 可能导致灾难性后果 ./-l; ls * # 可能是的 Globcome options # 使用可能成为选项 find 的通配符。 -exec sh -c 'a && b {}' \; # find -exec shell 注入 # find -exec shell 注入 printf "Hello $name" # printf 格式的变量 # 在 printf 的格式参数中使用 f 的变量 in $(ls *.txt); do # 迭代 ls 输出 # 迭代 ls 的输出 export MYVAR=$(cmd) # 屏蔽退出代码 # 使退出代码隐藏大小写 $version in 2.*) :;; 2.6.*) # Shadowed casebranch # Shadowed casebranch 可移植性 ShellCheck 在使用 shebang 不支持的功能时会发出警告例如,如果将 shebang 设置为 #!/bin/sh,ShellCheck 将警告可移植性问题 checkbashisms,类似于: Code Language: javascript copy echo {1..$n} # Works in ksh, but not bash/ dash/ sh # 在 ksh 中有效,但在 bash/dash/sh 中无效 echo {1..10} # 在 ksh 和 bash 中有效,但在 dash/sh 中无效 # 在 ksh 中有效,但在 bash/dash/sh 中无效 不可用 echo -n 42 # 在 ksh、bash 和 dash 中工作,在 sh 中未定义 # 在 ksh/bash/dash 中可用,在 sh 中不可用 trap 'exit 42' sigint # 不可移植的信号规范 # 不可移植的信号详细信息 cmd &> file # 不可移植的重定向运算符 #不可移植的重定向操作 read foo < /dev/tcp/host/22 # 不可移植的截获文件 # 不可移植的截获文件 foo-bar() { ..; } # 未定义/不支持的函数名 # 未定义/不支持的函数名 [ $UID = 0 ] # 在 dash/sh 中未定义的变量 # dash/sh 中未定义的变量 local var=value # sh 在 sh 中未定义本地时间 # sh sleep 中未定义本地时间1 | sleep 5 # 'tim 的未定义用途e' # 使用未定义的时间用法 各种 ShellCheck 还可以识别一系列其他问题: 代码语言:javascript copy PS1='\e[0;32m\$\e[0m ' # PS1 颜色不在 \[..\] # PS1 的颜色不在 \[..\] PATH="$PATH:~/bin" # $PATH 中的文字波形符 # $PATH 中的波形符 rm "file" # Unicode 引号 #Unicode 引号 echo "Hello world" # 回车/DOS 行结尾 # 传输返回 DOS 行结尾 /echo hello \ # \ 后的尾随空格 # \ \ 后的尾随空格 # \var=42 echo $var # 扩展内联环境 # 扩展 Connect 环境变量 # !/bin/bash -x -e # 常见的 shebang 错误 # shebang 命令错误 echo $((n/*)) # 不必要的精度损失 # 不必要的精度损失 ls *[:digit:].txt # 错误的字符类 glob # 错误的通配符 sed 's/foo/bar/' file > file # 重定向到输入 # 重定向到输入 while getopts "a" f; do case $f in "b") # Unhandled getopts flags # Unhandled getopts flag ShellCheck Sh 的优点ellCheck以其强大的功能和友好的用户界面成为SRE不可或缺的工具之一。

大大简化了代码审查流程,提高了代码的可维护性和安全性。随着技术的进步,ShellCheck有望增加更多功能,支持更广泛的Shell功能和语法,为SRE提供更全面的代码检查服务。

【SRE应该掌握的利器】提高Shell脚本质量的利器:ShellCheck

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 南京维立志博完成近2亿元融资,昆药集团、华方资本领投

    南京维立志博完成近2亿元融资,昆药集团、华方资本领投

    据投资界10月30日消息,南京维立志博生物科技完成新一轮近2亿元融资,昆明领投药业集团与华方资本联合领投,原股东恩然创投、慧歌资本及新投资机构国弘创投、明朗资本、新丝路投资、长江基金、熵资本参与投资。 本轮融资将主要用于加速公司多个抗肿瘤新药的全球研发。 维立志

    06-18

  • 8年投资了100多家公司,2年股价涨了10倍,这家公司刚刚被调查

    8年投资了100多家公司,2年股价涨了10倍,这家公司刚刚被调查

    很少有公司能够从谷底重生,两次!但新浪微博却做到了。   幸运地赢得了微博大战后,新浪微博成为了互联网新贵的代名词。 然而,在它变得太热之前,前面已经出现了强大的竞争对手。 2018年8月31日,已上市的微博股价跌至8.78。 美元,市值不到20亿美元。   逆转再次发生。

    06-17

  • 不仅仅是乐趣! Funtouch OS 3.0即将发布

    不仅仅是乐趣! Funtouch OS 3.0即将发布

    自2016年vivo首次发布基于Android深度定制的Funtouch OS 1.0系统以来,Funtouch OS凭借简约的理念,迅速成为市场上最受欢迎的系统之一,乐趣、智慧。 随着vivo手机销量的不断攀升,Funtouch OS系统的受众也越来越广。 今天,vivo在Funtouch OS官方微博正式发布了Funtouch OS

    06-18

  • 中国家纺5月18日正式上线,预计五年建成

    中国家纺5月18日正式上线,预计五年建成

    投资界5月18日消息南通微创办的中国家纺电商平台“中国家纺.cn” ——纺织电商董事长曹清今天正式上线。 在线的。 据悉,这是家纺行业首个集行业新闻和电子商务于一体的多元化功能网络服务平台。 初期投资1万多元,预计五年内上市。   在家纺行业有“世界家纺看中国,中国家

    06-18

  • 我们来谈谈创新创业,著名主持人华少即将来到阿里巴巴封神之战山东总决赛!

    我们来谈谈创新创业,著名主持人华少即将来到阿里巴巴封神之战山东总决赛!

    著名主持人、“中国好舌”华少确定出席2020年1月13日在山东聊城举行的阿里巴巴封神之战山东总决赛,扶持创新创业者。 除华少外,阿里云创业孵化器事业部总经理李中雨、山东伊街区产业发展集团有限公司总裁高庆民、金沙江联合资本管理合伙人周琪、真格基金投资副总裁尹乐、韩都

    06-18

  • Parallel 获得 Coinbase、Section 32 和StarkWare

    Parallel 获得 Coinbase、Section 32 和StarkWare

    4 月 2 日消息,Parallel Finance 是领先的去中心化借贷和质押协议,旨在将去中心化金融带入主流。 4 月 2 日,我们宣布获得 Coinbase、Section 32 和 StarkWare 的 10,000 美元战略投资,Parallel Finance 在最新战略扩张中估值达 5 亿美元。 这笔新资金将帮助 Parallel 推

    06-18

  • 数字演艺服务平台“Now Showing”宣布完成Pre-A轮融资,由梦网集团旗下子公司投资

    数字演艺服务平台“Now Showing”宣布完成Pre-A轮融资,由梦网集团旗下子公司投资

    投资界9月27日消息,日前,首单OMO数字演艺文化演艺产业服务平台——“现秀”(北京持续文化传媒有限公司)正式宣布完成Pre-A轮融资。 投资方为梦网集团全资子公司深圳市梦网科技发展有限公司。   北京持续文化传媒有限公司成立于2006年,在中国互联网新闻中心(中国网)的

    06-17

  • 智能汽车安全公司“木卫四”获数千万元种子轮融资,红杉中国种子基金独家投资

    智能汽车安全公司“木卫四”获数千万元种子轮融资,红杉中国种子基金独家投资

    投资圈(ID:pedaily)7月1日消息,智能汽车安全公司“木卫四”获数千万元种子轮融资,红杉中国种子基金独家投资近日获得红杉杉中国种子基金独家投资的数千万元种子轮融资。 本轮融资主要用于智能汽车安全产品的研发及应用。 耀明成立于年初,是一家致力于智能汽车安全的科技

    06-18

  • 英特尔CEO:我们不怪苹果放弃它,我们得用更强的芯片赢回来

    英特尔CEO:我们不怪苹果放弃它,我们得用更强的芯片赢回来

    凤凰网科技讯 北京时间10月18日,英特尔CEO帕特基辛格仍然希望赢回苹果。 不过这位客户认为,要做到这一点,英特尔的芯片必须比苹果自研的芯片更好。 当地时间周日,基辛格在接受美国新闻媒体Axios采访时表示,他并没有责怪苹果放弃英特尔并开发自己的芯片。 “苹果认为他们可

    06-08

  • Xilinx 首席执行官概述公司新愿景和战略蓝图

    Xilinx 首席执行官概述公司新愿景和战略蓝图

    2020 年 3 月 19 日,加利福尼亚州圣何塞 — 全球自适应和智能计算领导者 Xilinx, Inc.(纳斯达克代码:XLNX)总裁兼首席执行官(首席执行官彭维克今天透露了公司的未来愿景和战略蓝图。 Peng的愿景是为Xilinx带来新发展、新技术和新方向,打造“自适应计算加速平台”。 在这

    06-06

  • 另一种趋势诞生:55岁富婆开始卖玻尿酸饮用水

    另一种趋势诞生:55岁富婆开始卖玻尿酸饮用水

    可饮用的玻尿酸来了。 投资界获悉,3月22日,玻尿酸龙头企业华熙生物推出首个玻尿酸饮用水品牌“水鸡泉”。 产品成分仅为水和66mg玻尿酸,注重0糖、0脂肪、0卡路里。 网上,6瓶售价45.9元。 说起华西生物,就不得不提其背后的女老板——赵燕。 2000年,赵燕在一次偶然的机会下

    06-18

  • 令人惊叹的!三星发布Galaxy Fold折叠屏手机,S10系列沦为配角

    令人惊叹的!三星发布Galaxy Fold折叠屏手机,S10系列沦为配角

    随着MWC的到来,整个智能手机行业迎来了密集的手机发布过程。 尤其是2月20日,北京时间这一天小米9发布后,三星S10系列在大洋彼岸的旧金山亮相。 值得一提的是,去年三星在巴塞罗那MWC会场发布了S9系列。 。 三星对S10系列寄予厚望。 北京时间2月21日凌晨3点,三星重磅手机发

    06-18