Shell编码规范手册(shellcheck错误汇总)

Shell脚本加固效率量化:Shellharden自动化工具与手动修复的基准测试对比 Shell脚本作为系统运维和自动化任务的核心工具,其安全性至关重要。脚本加固通过静态分析和代码转换,旨在消除变量引用、命令替换等常见安全隐患,提升代码的健壮性。其技术价值在于将开发者从重复、易错的手动审查中解放,实现快速、一致的代码规范落地。在CI/CD流水线、遗产脚本库批量处理等应用场景中,自动化加固能显著提升开发效率与代码质量。本文通过基准测试,量化分析了Shellharden工具在修复准确性、时间效率及代码一致性维度的表现,并结合ShellCheck等工具,探讨了构建高效脚本安全防护体系的最佳实践。 阅读详情
AI摘要

该博客是Shell编码规范手册,提到shell脚本提交前要用静态代码扫描工具扫描并修改至无报错。介绍了工具使用步骤,还整理了shellcheck扫描出的错误编号,分为可选修改和必须修改两类,并针对每个编号给出报错信息、原因及解决办法。

Shell编码规范手册

背景

​ shell脚本提交以前必须用静态代码扫描工具shellcheck扫描,根据提示修改代码,需达到扫描后无报错即可通过。

工具使用

​ 安装shellcheck并使用命令进行扫描,具体步骤如下:

# 安装:
apt install shellcheck
# 扫描:
shellcheck  -x -s bash *.sh
# -s 指定使用 bash
# -x 给予shellcheck跟踪文件的权限,例如一个文件中导入了其他文件

错误编号

​ shellcheck扫描出的每一个错误,均有其编号,以SC+4位数字组成,google可搜索到详细建议,以下为整理出的部分编号,分为两部分:

  • 可选修改编号:部分场景下为正常现象,该错误无需修改,在文件头配置跳过该检测项与说明即可,配置命令# shellcheck disbale=编号
  • 必须修改编号:必须修改的错误
可选修改编号:
SC2154
  • 报错:SC2154: quiet_type is referenced but not assigned.
  • 原因:代码中使用的变量quiet_type被引用,但并未被赋值
  • 解决:在引用变量前对齐赋值
  • 特殊情况:应该测试框架加载了多个文件,文件中存在关联关系,当前文件未被赋值的变量是在其他文件中处理的,顾此时可以特殊处理,跳过该项检查,文件头注释:# shellcheck disable=SC2154
SC2034
if [ "$1" = "true" ] && [ "$2" = "true" ]
then 
	r="pass"
else 
	r="fail"
fi
  • 报错:SC2034: r appears unused. Verify use (or export if used externally).

  • 原因:变量r赋值后未被使用,因该文件是存放公共方法,顾变量r在脚本中不会被使用

  • 解决:在此文件跳过该项检查,文件头增加注释:# shellcheck disbale=SC2034

必须修改编号:
SC2162
read -t 8 -p "${tailor_11}""
  • 报错:SC2162:read without -r will mangle backslashes.
  • 原因:默认情况下,Read将解释空格和换行符之前的反斜杠,通常您只想读取数据,这就是read -r所做的。除非有充分的理由不使用-r,否则应该始终使用-r(请注意,read-r仍然会去掉前导空格和尾随空格。IFS=“”read-r可防止这种情况。)
  • 修改:
read -r -t 8 -p "${tailor_11}""
  • 例子:
read name
# 输入:\n z
# 输出:n z

read -r name
# 输入:\n z
# 输出:\n z
SC2181
apt install -y iso-tailor
if [ "$?" == "0" ]
then
...
  • 报错:SC2181:Check exit code directly with e.g. ‘if mycmd;’, not indirectly with $?.
  • 原因:source后不要跟变量
  • 修改:

if apt install -y iso-tailor;
then
...
SC1090
source "${PWD}/method/config.sh"
  • 报错:SC1090: Can’t follow non-constant source. Use a directive to specify location.
  • 原因:source后不要跟变量
  • 修改:
source "method/config.sh"
SC1091
source method/config
  • 报错:SC1091: Not following: method/config was not specified as input (see shellcheck -x).

  • 原因:file not found, no permissions, not included on the command line, not allowing shellcheck to follow files with -x

  • 解决:

    • 命令行输出检查命令时加上参数-x,允许shellcheck跟踪文件:shellcheck -x -s bash test.sh

      • 注意:当涉及文件无权限时,使用之后方法
    • 文件中错误命令上增加注释# shellcheck disable=SC1091,跳过该错误项检查:

        # 方法1验证有效
        # 注意:一般在对涉及文件无权限时,使用此方法
        # shellcheck disable=SC1091
        source method/assertion.sh
        
        # 方法2验证无效(why?)
        # 注意:一般在对涉及文件有权限时,使用此方法
        # shellcheck source=method/assertion.sh
        source method/assertion.sh
      
SC2219
  • 报错:SC2219: Instead of ‘let expr’, prefer (( expr )) .

  • 原因:使用(( )) 代替 let

  • 解决:

     # 修改前
     let a+=1 
     
     # 修改后
     (( a+=1 ))
    
SC2076
  • 报错:SC2076: Don’t quote rhs of =~, it’ll match literally rather than as a regex.

  • 原因:使用=~ 但右侧的值存在" ",那将按照字面量匹配,而非正则表达式

  • 解决:

     # 修改前
     
     # 修改方案1,不使用" ",但该场景是使用传入的值,无法控制,推荐使用方案2
     # 备注:若=~右侧非变量,去掉" "即可,若有空格可使用'\'
     if [[ "${2}" =~ ${1} ]]
     
     # 修改方案2,不使用 '=~'
     if [[ "${2}" == *"${1}"* ]]
    
SC2010
  • 报错:SC2010: Don’t use ls | grep. Use a glob or a for loop with a condition to allow non-alphanumeric filenames.

  • 原因:不要使用ls|grep,可使用glob通配符

  • 解决:

     #修改前
     iso="$(ls ${PWD}/resource/test_iso/ | grep iso)"
     
     #修改后
     iso="$(ls ${PWD}/resource/test_iso/*iso*)"
    
SC2046
  • 报错:Double quote to prevent globbing and word splitting.

  • 原因:当命令扩展未加引号时,将发生单词拆分和全局合并。当文件名包含空格时,这通常表现为中断。

  • 解决:

# 修改前
if [ $(command -v startdde) ];then
	os_type="gui"
else
	os_type="cli"
fi

#修改后
if [ "$(command -v startdde)" ];then
	os_type="gui"
else
	os_type="cli"
fi
SC2086
  • 报错:Double quote to prevent globbing and word splitting.

  • 原因:引用变量可防止单词拆分和全局扩展,并在输入包含空格、换行符、全局字符等时防止脚本中断。

  • 解决:

      # 修改前
      ls ${PWD}/.file
      
      #修改后
      ls "${PWD}/.file"
    
SC2188
  • 报错:SC2188: This redirection doesn’t have a command. Move to its command (or use ‘true’ as no-op).

  • 原因:重定向无命令

  • 解决:

     # 修改前
     > ${error_log_path}
     
     # 修改后
     true > ${error_log_path}
    
SC2013
  • 报错:SC2013: To read lines rather than words, pipe/redirect to a ‘while read’ loop.

  • 原因:要读取行,而不是词时,使用管道/重定向到while read循环

  • 解决:

     # 修改前
     for case_files in $(cat ${PWD}/.file/iso_case_list.log);do
     	source ${PWD}/case/iso_case/Round_${case_files}.sh
     done
     
     # 修改后
     while read -r line || [[ -n $line ]]; do
     	source "${PWD}/case/iso_case/Round_${line}.sh"
     done < "${PWD}/.file/iso_case_list.log"
    
SC2129
  • 报错:SC2129:Consider using { cmd1; cmd2; } >> file instead of individual redirects.

  • 原因:多个重定向时,建议使用{ cmd1; cmd2; } >> file,更为简洁

  • 解决:

     # Problematic code:
     
     echo foo >> file
     date >> file
     cat stuff  >> file
     
     # ------------------------
     
     # Correct code:
     
     {
       echo foo
       date
       cat stuff
     } >> fil
    
SC2126
  • 报错:SC2126:Consider using grep -c instead of grep | wc

  • 原因:grep+wc时,可使用grep -c代替

  • 解决:

     # Problematic code:
     grep "${com}" "${error_log_path}" | wc -l
     
     
     # Correct code:
     grep -c "${com}" "${error_log_path}"
    
SC2230
  • 报错:SC2230:which is non-standard. Use builtin ‘command -v’ instead.

  • 原因:which是在PATH中定位可执行文件的非标准外部工具。command -v是一个POSIX标准内置命令,它使用与shell本身相同的查找机制,使用command -v代替which

  • 解决:

     # Problematic code:
     which wc
     
     
     # Correct code:
     command -v wc
    
SC2002
  • 报错:SC2002:Useless cat. Consider ‘cmd < file | …’ or ‘cmd file | …’ instead.

  • 原因:CAT是启用文件的工具。将单个文件作为程序的输入读取被认为是对Cat(UUOC)的无用使用。简单地使用重定向更高效、更少迂回。对于可以从可查找的输入中获益的程序(如Tail或tar),情况尤其如此。

  • 解决:

     # Problematic code:
     cat file | grep iso
     cat file | wc -l
     
     # Correct code:
     grep iso file
     wc -l < file
    
SC2164
  • 报错:SC2164:Use cd … || exit in case cd fails.

  • 原因:CAT是启用文件的工具。将单个文件作为程序的输入读取被认为是对Cat(UUOC)的无用使用。简单地使用重定向更高效、更少迂回。对于可以从可查找的输入中获益的程序(如Tail或tar),情况尤其如此。

  • 解决:

     # Problematic code:
     cd generated_files
     rm -r *.c
     
     func(){
       cd foo
       do_something
     }
     
     
     # Correct code:
     cd generated_files || exit
     rm -r *.c
     
     func(){
       cd foo || return
       do_something
     }
    
SC2145
  • 报错:SC2145:Argument mixes string and array. Use * or separate argument.

  • 原因:参数混合了字符串和数组。使用*或单独的参数。

  • 解决:

     #Problematic code:
     printf "Error: %s\n" "Bad parameters: $@"
     #Correct code:
     printf "Error: %s\n" "Bad parameters: $*"
     
     #Problematic code 2:
     printf "Error: %s\n" "Bad parameters: ${ARRAY_VAR[@]}"
     #Correct code 2:
     printf "Error: %s\n" "Bad parameters: " "${ARRAY_VAR[@]}"
    
SC2185
  • 报错:SC2185:Some finds don’t have a default path. Specify ‘.’ explicitly.

  • 原因:如果没有提供搜索路径,GNU和Busybox find将使用当前目录的默认路径。在POSIX、MacOS/OSX、FreeBSD、OpenBSD和NetBSD上,它反而会导致错误。

  • 解决:

     #Problematic code:
     find |grep test_b_logo
     
     #Correct code:
     find . |grep test_b_logo
    
SC2012
  • 报错:SC2012:Use find instead of ls to better handle non-alphanumeric filenames.

  • 原因:如果您想要的仅仅是文件名或它们的数量,那么ls通常可以替换为find。

  • 解决:

     #Problematic code:
     ls case/iso_case/Round*
     
     #Correct code:
     find case/iso_case/Round*
     
     
     # 注意:
     # find输出具有找到的文件的完整路径,相对于运行find的当前工作目录,而ls只有文件名。
     # 所以如果只是项获取文件名,在ls替换find的时候需要做额外的处理
    
SC2143
  • 报错:SC2143:Use grep -q instead of comparing output with [ -n … ].

  • 原因:grep判断结果时,使用grep -q,而不是将结果输出,正确的代码更干净,并在第一个匹配行停止,避免了迭代目录的其余部分和将数据读入内存。

  • 解决:

     #Problematic code:
     if [ "$(find . | grep 'IMG[0-9]')" ]
     then
       echo "Images found"
     fi
     
     #Correct code:
     if find . | grep -q 'IMG[0-9]'
     then
       echo "Images found"
     fi
    
SC2001
  • 报错:SC2001: See if you can use ${variable//search/replace} instead.

  • 原因:echo 变量+sed处理输出时,壳尝试使用${variable//search/replace}

  • 解决:

     #Problematic code:
     string="stirng" ; echo "$string" | sed -e "s/ir/ri/"
     
     #Correct code:
     string="stirng" ; echo "${string//ir/ri}"
    
SC2116
  • 报错:SC2116: Useless echo? Instead of ‘cmd $(echo foo)’, just use ‘cmd foo’.

  • 原因:无用的echo

  • 解决:

     #Problematic code:
     greeting=$(echo "Hello, $name")
     # or
     tar czf "$(echo "$(date +%F).tar.gz")" *
     
     #Correct code:
     greeting="Hello, $name"
     # or
     tar czf "$(date +%F).tar.gz" *
    
SC2059
  • 报错:Don’t use variables in the printf format string. Use printf “…%s…” “$foo”.

  • 原因:printf未使用%s

  • 解决:

     #Problematic code:
     printf "Hello, $NAME\n"
     
     #Correct code:
     printf "Hello, %s\n" "$NAME"
    
SC2066
  • 报错:SC2066: Since you double quoted this, it will not word split, and the loop will only run once.

  • 原因:for循环使用了数组:“array[*]”,由于使用了双引号,因此不会拆分单词,循环只会运行一次。

  • 解决:

     #Problematic code:
     for i in "${test_user_id[*]}";do
     
     #Correct code:
     for i in ${test_user_id[*]};do
     for i in "${test_user_id[@]}";do
    
SC2103
  • 报错:SC2103: Use a ( subshell ) to avoid having to cd back…

  • 原因:使用子shell执行命令,避免回放cd。

  • 解决:

     # Problematic code:
     
     for dir in */
     do
       cd "$dir"
       convert index.png index.jpg
       cd ..
     done
     
     # Correct code:
     
     for dir in */
     do
       (
       cd "$dir" || exit
       convert index.png index.jpg
       )
     done
     
     # or
     
     for dir in */
     do
       cd "$dir" || exit
       convert index.png index.jpg
       cd ..
     done
    
SC2035
  • 报错:SC2103: Use ./glob or – glob so names with dashes won’t become options.

  • 原因:因为文件和参数是以相同方式传递的字符串,所以程序不能正确地识别,使用./、--可避免这个问题。

  • 解决:

     # Problematic code:
     
     rm *
     
     # Correct code:
     
     rm ./*
     
     # or
     
     rm -- *
     
    
SC2124
  • 报错:SC2124: Assigning an array to a string! Assign as array, or use * instead of @ to concatenate.

  • 原因:将数组赋给字符串!赋值为数组,或使用*而不是@进行连接。

  • 解决:

     # Problematic code:
     xx() {
     
     	test="${@}"
     
     }
     
     # Correct code:
     
     xx() {
     
     	test="${*}"
     
     }
     
    
SC1012
  • 报错:SC1012: \t is just literal t here. For tab, use "$(printf '\t')" instead.

  • 原因:ShellCheck 发现了一个\t,\n或者\r在一个上下文中,它们只是变成了普通的字母t,n或者r。很可能,它被用作制表符、换行符或回车符。

  • 解决:

     # Problematic code:
     # Want tab
     var=foo\tbar
     # Want linefeed
     var=foo\nbar
     
     # Correct code:
     var="foo$(printf '\t')bar"  # As suggested in warning
     var="$(printf 'foo\tbar')"  # Equivalent alternative
     
     # Literal, quoted linefeed
     line="foo
     bar"
     
    
16、高效编写稳健Shell脚本的准则与工具 本文详细介绍了编写稳健且高效Shell脚本的准则与工具,涵盖编码规范基础、实践技巧、错误处理机制、命令行参数解析、帮助信息设计、信号陷阱、临时文件处理等内容,并推荐了ShellCheck和new_script等实用工具。通过遵循这些规范和使用相关工具,开发人员可以更高效地编写出可读性强、可维护性高的Shell脚本,适应各种复杂应用场景。 阅读详情

相关推荐

UE4虚拟现实实习总结---蓝图中的常用交互事件|人物行走|物体移动|动态触发|材质改变

这周是ue4实习周,老师给我们的任务就是基于中学物理和化学实验的虚拟实验室,要有交互事件,后期可以链接vr手柄进行操作。 但是实习开始老师影都没了,全靠自己学习。感觉自己学习了不少东西,这里就来总结一下!顺便感叹一下,ue4好玩又强大! 以下主要介绍蓝图中的几种交互事件1.新建游戏角色并且进行角色行走旋转,2.如何控制物体移动旋转,3.如何控制物体材质动态变化 大家可以举一反三,作出更好的作品 1.新建游戏角色并且进行角色行走旋转 步骤 在刚刚新建的文件夹中鼠标右击新建蓝图类,然后分别创建以下:chara

weixin_43902063的博客 6121

ShellCheck报出的各种错误及解决

ShellCheck报出的各种错误及解决

phmatthaus的专栏 5981

一生一芯预学习:从零搭建Verilator仿真环境与NVBoard实战

本文详细介绍了如何从零搭建Verilator仿真环境,并完成NVBoard实战项目,为'一生一芯'预学习提供完整指导。内容包括环境配置、工具安装、波形生成、自动化构建及可视化调试技巧,帮助初学者快速掌握数字逻辑设计与仿真验证的核心技能。

keras9composer的博客 701

linux shell 编码规范

Shell是用户与Linux或Unix内核通信的工具,shell编程指的并不是编写这个工具,而是指利用现有的shell工具进行编程,写出来的程序是轻量级的脚本,我们叫做shell脚本。 Shell的语法是从C语言继承过来的,因此我们在写shell脚本的时候往往能看到c语言的影子。 Shell脚本实在是太灵活了,相比标准的Java、C、C++ 等,它不过是一些现有命令的堆叠,这是他的优势也是他的劣势...

whatday的专栏 6298

【FOC无刷电机控制】六步换向、FOC,STM32cubemx从零开始搭建BLDC六步换相代码、FOC代码(基于霍尔传感器)

FOC、六步换相,无刷电机控制

xifan的博客 3万+

python——模拟砍价

类型:随机数。

m0_62488776的博客 1970

Don‘t use ls | grep. Use a glob or a for loop with a condition to allow non-alphanumeric filenames.

总的来说,尽管ls | grep模式在某些情况下可以正常工作,但由于其潜在的问题和限制,ShellCheck建议使用glob模式或带条件的for循环来替代。这些替代方案可以更准确地处理非字母数字文件名,并且可以避免引入不必要的复杂性。

Dontla的博客 663

5G核心网Framed Routing功能解析:基于PFCP的帧路由机制与多终端互联实践

5G核心网Framed Routing功能解析:基于PFCP的帧路由机制与多终端互联实践

大家好,我是码农老gou,一名专注于编程技术的程序员。在这个博客中,我将与大家分享我在工作和学习中的经验、见解以及一些实用的技术干货。 1464

其实Shell脚本可以更好

今天介绍使用的两个方法,提高脚本的可读性和健壮性,帮助写出更好的脚本。 一、vim自动添加头部注释信息 使用vim的自动命令(autocmd),在新建sh文件时添加头部的注释信息。在.vimrc中配置以后,使用vim操作文件的时候就会自动执行一些命令。 在用户home目录下新建.vimrc文件,写入下面的内容,在使用vim新建.sh文件时就会执行函数 SetTitle(),将头部注释信息写入到新建的.sh文件,这在编写脚本时十分方便。 最后一行的:autocmd BufNewFile * nor

u014389734的博客 667

STM32入门教程:图像处理

然后,我们使用 STM32 的 DSP 模块中的 arm_mean_u8 函数计算原始图像的平均值,并将结果存储在 meanValue 变量中。然后,我们需要编写代码配置 STM32 的外部中断输入引脚,并在中断处理函数中读取 OV7670 摄像头模块输出的图像数据。然后,我们需要编写代码配置 STM32 的 USB OTG 接口,并在回调函数中读取 USB 摄像头输出的图像数据。一、图像采集 图像采集是图像处理的第一步,我们需要将外部图像源的数据导入到 STM32 中进行处理。

2401_85625565的博客 1616

音频——DAC 性能测试

codec DAC 性能测试方法

tyustli 2235

Shell编程规范:Don‘t use ls | grep

文章目录背景ShellCheck的规范修改写法ls -l | grep prometheus && ls -l grafana | grep 'grafana.db'for循环语句ls | grep -v '\.sql\|\.zip'最后参考 背景 最近在写一个私有化部署脚本的时候频繁的使用了ls和grep的组合,但是插件ShellCheck却一直在给我标黄,我这该死的洁癖终于在今天受不了了,这个使用了这么多年的好搭档怎么就那么不讨喜呢! ShellCheck的规范 很明显,提示告诉我

靖哥哥的博客 1277

ransac拟合2D圆(三点定圆 c++详细版)

RANSAC(Random Sample Consensus,随机采样一致性)算法是一种基于随机采样的迭代算法,主要用于从一组包含大量噪声和异常值(外点)的数据中估计数学模型的参数。

twnkie的博客 1047

vscode-shellcheck团队协作终极指南:如何统一团队的Shell脚本编码规范

Shell脚本是开发运维工作中不可或缺的工具,但在团队协作中,Shell脚本的编码规范往往难以统一,导致代码质量参差不齐、维护困难。vscode-shellcheck作为Visual Studio Code的Shell脚本静态分析工具,为团队提供了完美的Shell脚本编码规范统一解决方案。本文将详细介绍如何利用vscode-shellcheck在团队中建立统一的Shell脚本编码规范,提升代码质量

gitblog_00473的博客 543

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

vscode-shellcheck自定义规则:如何创建和管理你的Shell检查规则集

vscode-shellcheck是一款集成ShellCheck到VS Code的插件,它能帮助开发者在编写Shell脚本时实时检测错误和潜在问题。本文将详细介绍如何为vscode-shellcheck创建和管理自定义规则集,让你的Shell脚本检查更符合项目需求。 ## 为什么需要自定义Shell检查规则? 每个项目都有其独特的编码规范和需求,默认的ShellCheck规则可能无法完全满足这

gitblog_00600的博客 408

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

vscode-shellcheck终极指南:如何在VS Code中集成强大的Shell脚本静态分析工具

你是否在编写Shell脚本时经常遇到语法错误、安全漏洞或代码风格问题?vscode-shellcheck是Visual Studio Code中不可或缺的Shell脚本静态分析工具,它能够帮助你快速发现并修复Shell脚本中的各种问题。这个强大的VS Code扩展集成了业界领先的ShellCheck工具,为开发者提供了实时的代码检查和智能修复功能。无论你是Shell脚本新手还是经验丰富的系统管理员

gitblog_00030的博客 437

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

推荐神器:ShellCheck GitHub Action

推荐神器:ShellCheck GitHub Action 在编写Shell脚本时,是否曾因小错误而浪费大量时间?现在有一个解决方案可以帮你避免这些问题。我们很高兴向你推荐一款强大的开源工具——ShellCheck GitHub Action,它结合了ShellCheck的智能检查功能和GitHub Actions的自动化能力,让你的Shell脚本代码质量更上一层楼。 项目介绍 ShellChec...

gitblog_00067的博客 471

推荐一款神器:VS Code上的ShellCheck插件

推荐一款神器:VS Code上的ShellCheck插件 项目地址:https://gitcode.com/gh_mirrors/vs/vscode-shellcheck 在日常的工作中,如果你经常处理Shell脚本,那么你可能已经意识到一个强大的静态代码检查工具的必要性。今天,我想向你推荐一款Visual Studio Code(VS Code)的扩展——ShellCheck,它能帮助你编写更安...

gitblog_00055的博客 916

推荐文章:SublimeLinter-shellcheck - Bash脚本编写者的神器

推荐文章:SublimeLinter-shellcheck - Bash脚本编写者的神器 在开发bash脚本时,是否曾因一个小小的语法错误或不规范的编码习惯而花费大量时间调试?SublimeLinter-shellcheck正是为了解决这一痛点而来。作为一款高效的代码检查工具插件,它将shellcheck的强大功能无缝集成到Sublime Text编辑器中,为你提供实时、精准的错误提示和优化建议。...

gitblog_00229的博客 909

告别脚本混乱:Google Shell Style Guide让你的Shell代码焕然一新

作为开发者,我们每天都在与Shell脚本打交道。无论是自动化部署、系统管理还是日常任务处理,Shell脚本都是不可或缺的工具。然而,随着项目规模的扩大,脚本往往变得难以维护,缩进混乱、命名随意、错误处理缺失等问题层出不穷。这时,一套规范的编码指南就显得尤为重要。Google Shell Style Guide正是这样一份权威指南,它能帮助你写出清晰、一致且可靠的Shell代码,让你的脚本从此告别混

gitblog_00798的博客 579

LinuxKit 代码风格指南:Shell、Go 与 C 三种语言的统一编码规范

> **导读**:本文以 LinuxKit 仓库的 [docs/coding-style.md](https://link.gitcode.com/i/b14ef9608d90b08732be9802068d53d3) 为核心,系统讲解该项目对 Shell、Go、C 三种语言的具体编码要求——Shell 遵循源自 Linux 内核规范的 Alpine 风格并使用 `shellcheck` 静态检查

gitblog_00918的博客 236

**引荐:sh-checker——您的Shell脚本质量守护者**

引荐:sh-checker——您的Shell脚本质量守护者 在日益复杂的软件开发环境中,静态代码分析已成为提升代码质量和可维护性不可或缺的环节。对于那些依赖于Shell脚本来驱动基础设施和自动化流程的团队而言,有一个强大的工具能够确保这些脚本既安全又高效变得尤为重要。今天,我们向大家隆重推荐一个开源项目——sh-checker,它将极大改善您Shell脚本的质量控制。 项目介绍 sh-checke...

gitblog_00037的博客 961

Shell脚本安全实战指南:从命令注入防御到安全编程规范

Shell脚本作为Linux/Unix系统管理和自动化任务的核心工具,其安全性常被忽视。脚本安全的核心在于理解常见漏洞原理,如命令注入、变量误用和权限滥用,这些漏洞可导致数据泄露或系统被控。通过建立纵深防御体系,从代码层、执行环境到运行时监控,能有效提升脚本的健壮性。在工程实践中,启用set安全选项、严格验证输入、使用数组传递参数以及借助ShellCheck进行静态分析,都是关键防御手段。尤其在涉及adb shell远程执行或动态防御场景时,安全脚本编写能显著降低风险。本文以日志清理为例,演示如何将安全原则

weixin_34212762的博客 372

10个Shell脚本安全防护技巧:从Google规范到企业级防御体系

Shell脚本作为系统管理和自动化任务的重要工具,其安全性直接关系到整个系统的稳定运行。GitHub加速计划/styleguide4/styleguide项目提供的Shell风格指南([shellguide.md](https://link.gitcode.com/i/2432ea9fa1510750f534cae91ad4e953))不仅规范了代码风格,更蕴含了丰富的安全防护思想。本文将从Goo

gitblog_01093的博客 850

Shell脚本安全增强工具sh-guard:超越ShellCheck的自动化防护实践

在Shell脚本开发与运维中,静态代码分析和安全规范检查是保障脚本质量与安全性的关键技术。其核心原理是通过解析脚本的抽象语法树(AST),匹配预定义的安全规则与编码规范,识别潜在漏洞与不良实践。这项技术的价值在于将防御性编程思想自动化,显著降低因变量未引号、命令注入、错误处理缺失等问题引发的生产事故风险,尤其适用于CI/CD流水线、自动化运维脚本等对可靠性要求高的场景。本文聚焦的sh-guard工具,正是这一领域的实践代表,它通过混合静态分析与动态包装策略,强化了对输入验证、临时文件安全等关键热点的防护,并

weixin_28729173的博客 231

Mole 贡献者实战指南:Bash 3.2 兼容规范、安全删除封装与 Go TUI 构建全流程

本文以 Mole 仓库的 [CONTRIBUTING.md](https://link.gitcode.com/i/cbc3bbd2eef745210e109bb8d35ab9b1) 为骨架,系统梳理向该项目贡献代码的完整工程流程:开发环境搭建、`check.sh`/`test.sh` 质量门禁的内部机制、Bash 3.2 兼容代码风格与 `set -euo pipefail` 安全写法、[lib

gitblog_00533的博客 346
上一篇: Git相关F&Q
下一篇: git创建新分支内容与当前分支差异
黄先生灬
博客等级 码龄10年 14粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值