shell开发常用

shell脚本debug

参考: https://akaedu.github.io/book/ch31s06.html


Linux的调用链

Linux的调用逻辑

+-----------------+
|      用户       |
+--------v---------+
         | 命令/操作
+--------v---------+
|      Shell      |
+--------v---------+
         | 库函数调用 (例如: printf, open)
+--------v---------+
|  动态库 (glibc) |
+--------v---------+
         | 系统调用 (例如: write, open)
+--------v---------+
|      内核      |
+--------v---------+
         | 硬件交互
+--------v---------+
|      硬件      |
+-----------------+

set -ex

在这里插入图片描述
set -ex是一个shell脚本命令,它用于在脚本执行期间启用调试模式和错误检查。下面是每个选项的解释:

  • set -e: 当任何命令失败时,出现命令行返回值为非0的情况时,立即退出脚本,后续命令不再执行。这可以帮助检测和防止脚本执行期间的错误。

  • set -x 或者 set -o xtrace: 启用跟踪(调试)模式,识别语法错误和逻辑错误,在执行每个命令之前,打印该命令及其参数。这可以帮助您了解脚本的执行过程,并检查脚本是否按预期执行。

通过将set -ex命令包含在shell脚本的开头,您可以在脚本执行期间实时检测错误,并跟踪脚本的执行过程。这对于调试脚本和确保脚本正确执行非常有用,特别是在复杂或长时间运行的脚本中。

#!/bin/bash

# 在脚本执行期间实时检测错误,并跟踪脚本的执行过程。
set -ex

# 执行一些命令
echo "Starting script..."

# 模拟错误
foobar

# 执行其他命令
echo "Script finished."

在这里插入图片描述


bash -xv显示脚本执行详情

## -x 跟踪执行信息,每一条命了和结果都打印下来
## -v 一边执行脚本,一边将执行过的脚本命令打印到标准错误输出
bash -xv ./test.sh

# 检查但不执行脚本
## -n 用于检查脚本中的语法错误
bash -n ./test.sh

shell特殊字符

和其他编程语言一样,Shell也有一些保留字(特殊字符),在编写脚本时需要注意:

特殊字符说明
#注释
字符串引用
\转义
/路径的分隔符
!表示反逻辑

查看当前使用的shell

# 查看系统支持的shell:
cat /etc/shells

在这里插入图片描述

# 查看当前登陆用户默认shell
echo $SHELL

在这里插入图片描述

# 查看当前的shell
echo $0

在这里插入图片描述


修改默认shell

# 修改shell为zsh
chsh -s /bin/bash root

# 为root用户设置zsh为系统默认shell:
chsh -s /bin/zsh root

# 恢复bash为系统默认shell:
chsh -s /bin/bash root

shell中的eval命令

https://www.cnblogs.com/faberbeta/p/linuxshell_eval.html
eval命令可以将字符串变成命令执行。

试验步骤:
首先创建一个file文件,在这个文件中输入文本。

# 创建一个file文件
cat>file<<END
> hello bit
> i am a good boy!!
> END

# 查看file内容

在这里插入图片描述
然后将cat file赋给变量myfile

# 将cat file赋给变量myfile
myfile="cat file"

# 查看myfile变量
echo $myfile

在这里插入图片描述


使用eval将字符串转为命令执行

evalmyfile变量输出的字符串cat file作为命令执行,输出了file文件中的内容。

# 使用eval将字符串转为命令执行
eval $myfile

在这里插入图片描述


shell执行方式

  • bash :bash 脚本名.sh
  • sh :作用及用法与bash相同
  • source加载/生效配置文件(环境变量,别名),脚本中可以实现include引入脚本到该脚本
  • .空格 : 作用与source一致

在这里插入图片描述


shell续行符

续行符" \ "进行参数换行/续行


shell编程插件

shell没有IDE编辑器,shell开发常用的VSCode插件。


win-sh解释器

WIndows下编辑shell脚本,可以使用这个shell解释器来进行shell开发。
https://sourceforge.net/projects/win-bash/

Shell文件最终还是在Linux运行的,在编辑器中运行Shell最多只能用来调试和书写,解除一些基本的Bug,在编辑器中完成基本的调试后,还是需要在Linux中得到最终的验证。


shellcheck

Shellcheck 可以帮助您在编写 shell 脚本时发现常见的错误和漏洞。它会检查您的代码,并提供有用的建议和警告。
https://marketplace.visualstudio.com/items?itemName=timonwong.shellcheck
也可以直接使用yum包管理器安装

# 依赖epel源
yum install -y ShellCheck

Bash Debug

Bash Debug 可以帮助您调试 shell 脚本。它支持断点、单步执行、变量监视等功能,可以让您更轻松地发现和修复错误。
https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug


Bash IDE

Bash IDE 提供了许多实用的功能,如代码自动完成、语法高亮、代码片段等,可以帮助您更快地编写 shell 脚本。
https://marketplace.visualstudio.com/items?itemName=mads-hartmann.bash-ide-vscode


shell-format

Shell Format 可以帮助您格式化 shell 脚本,使其更易于阅读和维护。它支持多种格式化选项,并可以与其他插件集成使用。
我个人还是比较习惯idea的快捷键
https://marketplace.visualstudio.com/items?itemName=foxundermoon.shell-format

# Windows需要安装shfmt才支持
choco install shfmt -y

# mac安装shfmt
brew install shfmt

# Linux安装shfmt
curl -o /usr/local/src/shfmt https://mirror.ghproxy.com/https://github.com/mvdan/sh/releases/download/v3.8.0/shfmt_v3.8.0_linux_amd64
# 移动到/usr/local/bin
mv /usr/local/src/shfmt /usr/local/bin/shfmt
# 赋予执行权限
chmod +x /usr/local/bin/shfmt

shellman

Shellman 提供了一个快速方便的命令行手册,您可以在编辑器中查看和搜索 shell 命令的手册页。
https://marketplace.visualstudio.com/items?itemName=Remisa.shellman


idea快捷键–格式化代码

如果是从idea或者pycham转过来的大佬,应该更习惯idea的快捷键.
https://marketplace.visualstudio.com/items?itemName=k–kato.intellij-idea-keybindings


中文符号转英文符号

写代码时经常会因为中文符号导致代码报错,这个插件可以自动将输入的中文符号转换为英文符号。
https://marketplace.visualstudio.com/items?itemName=brand.change-symbol


AutoComplate shell–自动补全代码–(可选)

常用 bash 变量和函数的自动完成功能。
https://marketplace.visualstudio.com/items?itemName=truman.autocomplate-shell


Code Runner–(可选)

运行代码


TabNine–(可选)

超好用的代码自动补全插件


CodeGeeX–(可选)

参考: https://www.v2ex.com/t/891044#reply7

现在 Copilot 已经不免费了。最近找到个开源的替代,叫 CodeGeeX 。
项目地址 https://github.com/THUDM/CodeGeeX

VSCode 插件 https://marketplace.visualstudio.com/items?itemName=aminer.codegeex


shell多行注释

可以使用: "注释内容"进行多行注释

#!/usr/bin/env bash

# 单行注释

: "多
行
注
释"

echo "多行注释测试"

良好代码风格

编写、使用或维护 Shell 脚本的管理员不可避免地会遇到脚本的错误

  • 错误通常是由于输入错误、语法错误或脚本逻辑不佳导致
  • 在编写脚本时,将文本编辑器与 bash 语法高亮显示结合使用可以帮助使错误更明显
  • 找到并排除脚本中错误的最直接方法是调试
  • 避免在脚本中引入错误的另一种简单方法是在创建脚本期间遵循良好风格

以下是要遵循的一些具体做法:

  • 将长命令分解为多行更小的代码块,代码段越短,就越便于读者领悟和理解
  • 将多个语句的开头和结尾排好,以便于查看控制结构的开始和结束位置以及它们是否正确关闭
  • 对包含多行语句的行进行缩进,以表示代码逻辑的层次结构和控制结构的流程 
  • 使用行间距分隔命令块以阐明一个代码段何时结束以及另一个代码段何时开始 
  • 在整个脚本中通篇使用一致的格式
  • 添加注释和空格如何能够极大改善脚本可读性
  • 利用这些简单做法,极大方便了用户在编写期间发现错误,还提高了脚本对于将来读者的可读性

image.png

修改后的脚本:

#!/bin/bash

# 此脚本是读取关于kernel相关的软件包信息,并从RPM数据库中查询软件包的安装时间
PACKAGETYPE=kernel
PACKAGES=$(rpm -qa | grep $PACKAGETYPE)
# 循环处理信息
for PACKAGE in $PACKAGES; do
    # 查询每个软件包的安装时间截
    INSTALLEPOCH=$(rpm -q --qf "%{INSTALLTIME}\n" $PACKAGE)
    # 把时间截转换为普通的日期时间
    INSTALLDATETIME=$(date -d @$INSTALLEPOCH)
    # 打印信息
    echo "$PACKAGE was installed on $INSTALLDATETIME"
done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

教Linux的李老师

赞赏是第一生产力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值