脚本错误-Linux-通过shellcheck查找和修复-Shell (脚本错误是什么意思?如何解决)

教程大全 2025-07-19 00:43:20 浏览

在Linux/Unix平台下编写Bash的时候,shellcheck是一款不错的工具。当编译大量的Bash代码的,常常会花掉大量的时间,然而通过shellcheck你可以提前知道脚本的语法问题,shellcheck也会给出纠错提示。

安装 shellcheck

要在基于 Debian/Apt 的 Linux 发行版(如 Ubuntu 和 Mint)上安装 shellcheck ,请在终端中执行以下命令:

linuxmi@linuxmi:~/www.linuxmi.com$sudoaptinstallshellcheck

要在基于 RedHat/yum 的 Linux 发行版(如 RHEL、Centos 和 Fedora)上安装 shellcheck ,请在终端中执行以下命令:

linuxmi@linuxmi:~/www.linuxmi.com$sudoyuminstallshellcheck

运行*shellcheck*

在安装了 shellcheck 后,我们就可以用一个损坏的脚本做一个简单的测试。首先我们定义我们的脚本 linuxmi.com.sh 如下:

'Bash不是Hash echo为我回应更多错误www.linuxmi.com" if[-d./linuxmi};than echo'sure!

你能找到多少bug?( 提示:有 8 个! )。接下来让我们看看 shellcheck 对这段代码的影响:

linuxmi@linuxmi:~/www.linuxmi.com$shellchecklinuxmi.sh

它立即在第一行发现规范存在问题。我们的 shebang 这一行 #!/bin/hash 应该是 #!/bin/bash 。让我们解决这个问题。问题 1/8 已修复!我们还将同时修复 shellcheck 立即识别的另外两个问题: 您是否忘记关闭这个单引号字符串?(Did you forget to close this single quoted string?), 对于第二行:很准!问题 2/8 已修复。对于第三个问题,我们/开发人员对 shellcheck 的意图有点混乱,这是可以预料的,因为第2 行打开了一个字符串,该字符串仅在第 5 行看到另一个时才终止!由于第三个问题是第二个问题 的结果, 因此这次运行将允许我们暂时修复两个问题。我们的脚本现在看起来像这样:

为我回应更多错误www.linuxmi.com

在进行更正后,让我们再次运行 shellcheck,看看输出是什么。在这种情况下,shellcheck 看到一个在第 3 行打开(即使它在行尾,它实际上是一个 打开 的双引号),并且即使在脚本结尾(注意第 8 行的指示,这在我们的6行脚本中并不存在,在最后一行之后只有一个空行。让我们清理这一空行,并修复第3行开头的双引号问题,现在可以很容易地理解。问题3/8已修复!我们的脚本现在看起来像这样:

[-d./linuxmi};than

重新运行 shellcheck(注意这些步骤与在其他编码语言中使用编译器有多么相似):再清楚不过了; 提到的语法错误出现在这个 if 表达式中 ,并且预期测试将在这里结束。我们将按照建议进行操作并将更改为,使该行变为 if [ -d ./linuxmi ]; than . 问题 4/8 已修复!我们重新运行 shellcheck,现在显示以下内容:另一个单引号问题。我们已经知道如何解决这些问题。让我们更改 echo 'sure! 为 echo 'sure!' (问题 5/8 已修复!)并再次重新运行 shellcheck:有趣的是,我们看到 shellcheck 无法解析一行。虽然这看起来像是 shellcheck 中的一个缺点,但进一步阅读,我们会发现中的应该为 a。哦哦!我们要放置而不是. 多么粗心的错误 很容易修复(问题 6/8 已修复!)。我们的脚本现在看起来像这样:

[-d./linuxmi];

另一个 shellcheck 运行为我们提供了另一个有用的信息:我们把弄丢了!哦哦,是的,不行。我们要在脚本的最后一行更改为。(问题 7/8)修复。并再次运行 shellcheck!重定向问题。老实说,我没想到 shellcheck 也会发现这个错误,因为 它也可以在 Bash 中使用,但它确实发现了。事实上,我们的重定向是为了代替 .问题 8/8 – 所有问题 – 已修复!这就引出了最后一个脚本

[-d./linuxmi];>start

让我们看看 shellcheck 现在是怎么想的。完美的!从第一次执行开始,脚本运行完美。如果您查看各种 shellcheck 命令的输出,您还会注意到 shellcheck 的另一个非常方便的功能。尤其是对于初学者:显示一组超链接(网站链接),可以在终端窗口中单击鼠标,或者您可以选择(如有必要)> 右键单击以复制然后粘贴到浏览器中。单击此类链接将带您进入shellcheck GitHub 项目。

如果您只想快速检查最重要的选项,您可能希望查看该 --severity={SEVERITY} 选项,您可以将 {SEVERITY} 其中的一个替换为 error, warning, info, style .因此,您只是在寻找错误和警告,您将使用 --severity=warning (包括更高级别,在这种情况下仅为)作为 shellcheck 的选项。

如果脚本中的逻辑没有问题,则 shellcheck 在执行脚本之前运行并修复所有发现的问题将确保第一次运行时准完美。您甚至可以在该编码挑战中使用 shellcheck 进行下一次现场 Bash 编码面试!在本文中,我们探讨了脚本中可能出现的各种问题以及如何 shellcheck 处理它们。


怎么用就设置linux中的vim的颜色

因为要写脚本 使用vi编辑器必然不太友好,不会有颜色区分和显示内容,好吧,就选择使用vim 可是遇到颜色调试的问题,周折了很久才搞定。 分享一下哈环境一:直接登录linux(cent5.X cent6.X)系统(前提你安装了vimp这个编辑器软件)问题:vim fimename#vim编辑文件的时候编辑的字符只有一种颜色,正常来说应该不同的语法成分会有不同的颜色呈现。 解决方法:可能原因:[root@gjlin init.d]# vi /etc/vimrc#编辑这个文件加入“syntax on” 这一行字符串。 (如果有查看是否否被注释掉了,把注释去掉即可)环境二:使用SSH工具我使用的是SecureCRT这个软件连接到linux系统的。 问题:vim fimename#vim编辑文件的时候编辑的字符只有单一颜色,正常来说应该不同的语法成分会有不同的颜色呈现。 解决方法:1、首先按照环境一的方法检查一下,如果环境一的情况不在进行第二步。 2、修改终端TERM这个环境变量:1)export命令 临时生效[root@gjlin init.d]# echo $TERMxterm#如果结果显示:非“xterm”执行如下命令[root@gjlin terminfo]# export TERM=xterm <------------使用export命令声明,变量在关闭shell时失效(临时)2)修改配置/etc/profile[root@gjlin tmp]# vim /etc/profileexport TERM=xterm <------------------增加此行即可。 保存退出。 #想要马上生效就要运行以下命令[root@gjlin tmp]# source /etc/profile《--------------加载一下配置文件,否则下次登录时才会生效。 注:如果第2步还未是没有解决问题进行第三步。 3、设置CRT。 options -->Session Options -->Terminal-->Emulation中将Terminal下拉菜单选xterm然后将必须钩上ANSI Colour

脚本错误

如何将shell脚本变为可执行文件

方法一、可以使用gzexe命令直接将shell脚本变成可执行文件,命令为gzexe 后面接要处理的shell文件名。 加密后,用file查看文件类型已经为二进制文件了,执行都可以正常执行的。 方法二、可以使用shc命令将shell脚本变为可执行文件。 1、安装shc2、加密脚本文件CFLAGS=-static shc -r -f 指明为static静态编译,因为默认生成的是动态库,在不同的系统可能运行不了。 -r也是为了生成的脚本二进制可执行程序能在其它的电脑上运行,-f参数用于指明要编译的脚本文件。 3、正常执行加密后的脚本文件。 4、shc常用参数说明-e date (指定过期日期)-m message (指定过期提示的信息)-f script_name(指定要编译的shell的路径及文件名)-r Relax security. (可以在相同操作系统的不同系统中执行)-v Verbose compilation(编译的详细情况)

Linux 如何设置可执行程序的文件名?? 急急急 在线等

是说脚本吗- -。 脚本一般是如果是c编译产生的可执行文件还可以是.o一般没有扩展名也可以- -。 linux下,当你使用./xxx运行一个程序时,首先是SHELL来接管你的输入,然后用fork派生子进程,最后用execv系列将你的那个程序的代码交给内核1。 检查你运行的文件的属性,其属性在它的I节点中描述,如果你的那个文件不是可执行的属性,结果就会拒绝执行,如果有可执行的属性,但可执行的权限高于你目前正在使用的用户的权限,拒绝执行2。 检查是SHELL文件吗?如果是,调用相应的SHELL来解析你的这个脚本文件3。 是ELF文件格式吗??是coff文件格式吗?是文件格式吗?如果是其中任何一种,并且当前的LINUX内核都支持这三种文件格式,那么就由操作系统内核分析你的文件格式,去掉文件头信息,将真正的代码,数据等加载进内存(实际过程并不是这样的,只不过为了描述简单,所以省略了很多细节,更多详细说明,请参见内核中的execv系统调用)...4.等待系统的进程调度,当内核选中你的那个程序的时候,你的那个程序就得到运行了

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐