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将字符串转为命令执行
eval
将myfile
变量输出的字符串cat file
作为命令执行,输出了file
文件中的内容。
# 使用eval将字符串转为命令执行
eval $myfile
shell执行方式
bash
:bash 脚本名.shsh
:作用及用法与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 语法高亮显示结合使用可以帮助使错误更明显
- 找到并排除脚本中错误的最直接方法是调试
- 避免在脚本中引入错误的另一种简单方法是在创建脚本期间遵循良好风格
以下是要遵循的一些具体做法:
- 将长命令分解为多行更小的代码块,代码段越短,就越便于读者领悟和理解
- 将多个语句的开头和结尾排好,以便于查看控制结构的开始和结束位置以及它们是否正确关闭
- 对包含多行语句的行进行缩进,以表示代码逻辑的层次结构和控制结构的流程
- 使用行间距分隔命令块以阐明一个代码段何时结束以及另一个代码段何时开始
- 在整个脚本中通篇使用一致的格式
- 添加注释和空格如何能够极大改善脚本可读性
- 利用这些简单做法,极大方便了用户在编写期间发现错误,还提高了脚本对于将来读者的可读性
修改后的脚本:
#!/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