当前位置: 首页 > news >正文

Shell 脚本编程完全指南

前言

在当今的计算机世界中,自动化已成为提高效率和减少重复工作的关键。无论是系统管理员、开发人员还是数据分析师,掌握 Shell 脚本编程都是一项极其有价值的技能。Shell 脚本作为 Linux 和 Unix 系统的"粘合剂",能够将各种命令和工具巧妙地组合起来,完成复杂的任务。

为什么学习 Shell 脚本?

  1. 高效自动化:通过编写脚本,可以将繁琐的重复性工作自动化,节省大量时间和精力

  2. 系统管理:是 Linux 系统管理的必备技能,用于监控、备份、部署等任务

  3. 强大灵活:能够调用系统所有命令和工具,功能几乎无限

  4. 快速原型:适合快速验证想法和编写工具原型

  5. 跨平台:大多数 Unix-like 系统都支持 Shell 脚本

学习目标

通过本文,你将学会:

  • 创建和执行你的第一个 Shell 脚本

  • 理解和使用变量、字符串操作

  • 掌握参数传递和命令行交互

  • 熟练运用各种运算符进行数学和逻辑运算

  • 编写实用的自动化脚本解决实际问题

        无论你是想要自动化日常任务,还是希望深入理解 Linux 系统工作原理,Shell 脚本都是你必须掌握的技能。让我们开始这段有趣的学习之旅,探索 Shell 脚本的强大功能吧!


1 Shell 脚本

1.1 创建脚本文件

vim 【文件名.sh】
进入配置文件
------------------------
#!/bin/bash
​
echo "Hello, World!"
echo "你好,今天过得怎么样"
  • #!/bin/bashshebang,指定解释器

  • # 注释:注释内容,不会被执⾏

  • echo:输出命令

1756382663486

1.2 执行 Shell 脚本

1.2.2 添加执行权限
chmod +x hello.sh    # 添加执行(x)权限
1.2.1 执行脚本的方式
方法一:sh /xx/【文件名.sh】     #没有执行权限也可以使用(绝对路径和相对路径都可以引用)
​
方法二:./【文件名.sh】          #需要执行权限,当前目录下执行
​
方法三:/xx/【文件名.sh】        #需要执行权限,通过绝对路径执行
1.2.3 使用 source 命令
source hello.sh      # 在当前shell环境中执行

2 变量使用

2.1 什么是变量

变量是 Shell 脚本中用于存储数据的容器,相当于给数据起一个名字,方便在脚本中重复使用和修改。你可以把变量想象成一个贴了标签的盒子,盒子里可以放各种东西(数据),我们通过标签名(变量名)来找到和使用盒子里的内容。

2.2 为什么需要变量

  1. 代码重用:一次定义,多次使用

  2. 易于维护:修改数据只需修改变量值

  3. 提高可读性:有意义的变量名让代码更易懂

  4. 动态处理:可以根据需要改变存储的值

2.3 变量定义和使用

#!/bin/bash
​
# 定义变量(等号两边不能有空格)
name="张三"
age="25"
p="$(ping -c 4 www.baidu.com)"          # 命令执行结果赋值
​
# 使用变量
echo "姓名: $name"
echo "年龄: $age"
echo "文件列表: $p"
​
-----------------------------------------------------------------------
# 只读变量
readonly country="中国"       # 锁定将无法更改(但只是临时,重启之后就就失效了)
# country="美国"              # 这行会报错
​
# 删除变量
unset age

2.4 变量类型

  • 局部变量:只在当前shell实例中有效

  • 环境变量:所有程序都能访问

  • shell变量:shell程序设置的特殊变量


3 字符串操作

3.1 字符串定义和操作

#!/bin/bash
​
str1="Hello"
str2="World"
​
# 字符串拼接
result1="$str1 $str2"
result2=$str1$str2
​
echo "拼接结果1: $result1"
echo "拼接结果2: $result2"
​
# 字符串长度
length=${#str1}
echo "'$str1' 的长度: $length"
​
# 子字符串提取
string="abcdefghijk"
echo "第2-5个字符: ${string:1:4}"    # bcde
echo "从第3个开始: ${string:2}"      # cdefghijk
​
# 字符串替换
message="I like apple, apple is good"
echo "替换第一个apple: ${message/apple/orange}"
echo "替换所有apple: ${message//apple/orange}"

3.2 特殊参数变量

变量说明
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数。
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。
$?显示最后命令的退出状态。0表示没有错误,非0值 表明有错误。
$$当前脚本的进程ID
$!最后一个后台运行进程的ID

3.3 参数传递

#vim ceshi.sh
------------------------------------------
#!/bin/bash
​
echo "脚本名称: $0"
#echo "第一个参数: $1"
#echo "第二个参数: $2"
echo "所有参数的个数: $#"
echo "所有参数: $@"
echo "所有参数 (作为一个字符串): $*"
​
# 打印问候语
echo "Hello, $1! Good $2!"
​
--------------------------------------------------------
添加权限,执行
chmod +x ceshi.sh
./ceshi.sh apple baby morning
--------------------------------------------------------
输出结果
脚本名称: ./ceshi.sh
所有参数的个数: 2
所有参数: baby morning
所有参数 (作为一个字符串): baby morning
Hello, baby! Good morning!
​

4 运算符

4.1 参数传递式计算

#!/bin/bash
echo "输入的第一个数为:"$1
echo "输入的第二个数为:"$2
echo "输入的第三个数为:"$3
echo "有多少个数字:"$#
​
#求和公式
sum=$(($1+$2+$3))
echo "$1+$2+$3=$sum"
----------------------------------------------------------------
输出结果
# ./wise02.sh 234 532 523
输入的第一个数为:234
输入的第二个数为:532
输入的第三个数为:523
有多少个数字:3
234+532+523=1289

4.2 交互式计算

#!/bin/bash
read -p "请输入的第一个数为:" num1
read -p "请输入的第二个数为:" num2
read -p "请输入的第三个数为:" num3
​
#求和公式
sum=$(( num1 + num2 +num3 ))
echo "$num1+$num2+$num3=$sum"
​
----------------------------------------------------------------
输出结果
# ./wise03.sh 
请输入的第一个数为:123
请输入的第二个数为:341
请输入的第三个数为:1234
123+341+1234=1698

4.3 关系运算符

#!/bin/bash
​
x=10
y=20
​
if [ $x -eq $y ]; then echo "x等于y"; fi
if [ $x -ne $y ]; then echo "x不等于y"; fi
if [ $x -gt $y ]; then echo "x大于y"; fi
if [ $x -lt $y ]; then echo "x小于y"; fi
if [ $x -ge $y ]; then echo "x大于等于y"; fi
if [ $x -le $y ]; then echo "x小于等于y"; fi

4.4 布尔运算符

#!/bin/bash
​
a=10
b=20
​
if [ $a -lt 100 -a $b -gt 15 ]; thenecho "a<100 且 b>15"
fi
​
if [ $a -gt 5 -o $b -lt 10 ]; thenecho "a>5 或 b<10"
fi

4.5 字符串运算符

#!/bin/bash
​
str1="hello"
str2="world"
str3=""
​
if [ $str1 = $str2 ]; then echo "字符串相等"; fi
if [ $str1 != $str2 ]; then echo "字符串不相等"; fi
if [ -z $str3 ]; then echo "字符串长度为0"; fi
if [ -n $str1 ]; then echo "字符串长度不为0"; fi
if [ $str3 ]; then echo "字符串不为空"; else echo "字符串为空"; fi

4.6 文件测试运算符

#!/bin/bash
​
file="example.txt"
​
if [ -e $file ]; then echo "文件存在"; fi
if [ -f $file ]; then echo "文件是普通文件"; fi
if [ -d $file ]; then echo "文件是目录"; fi
if [ -r $file ]; then echo "文件可读"; fi
if [ -w $file ]; then echo "文件可写"; fi
if [ -x $file ]; then echo "文件可执行"; fi
if [ -s $file ]; then echo "文件不为空"; fi

7. 实用示例

计算器脚本

#!/bin/bash
# calculator.sh
​
if [ $# -ne 3 ]; thenecho "用法: $0 数字1 运算符 数字2"echo "支持运算符: + - * / %"exit 1
fi
​
case $2 in"+") result=$(( $1 + $3 )) ;;"-") result=$(( $1 - $3 )) ;;"*") result=$(( $1 * $3 )) ;;"/") result=$(( $1 / $3 )) ;;"%") result=$(( $1 % $3 )) ;;*) echo "不支持的运算符: $2"; exit 1 ;;
esac
​
echo "$1 $2 $3 = $result"

使用示例

./calculator.sh 10 + 5
./calculator.sh 20 * 3

系统信息脚本

#!/bin/bash
# system_info.sh
​
echo "=== 系统信息 ==="
echo "主机名: $(hostname)"
echo "用户名: $(whoami)"
echo "当前目录: $(pwd)"
echo "系统时间: $(date)"
echo "运行时间: $(uptime)"
echo "内存使用:"
free -h
echo "磁盘使用:"
df -h

8. 最佳实践

  1. 添加 shebang:总是以 #!/bin/bash 开头

  2. 使用注释:解释代码功能

  3. 错误检查:检查命令执行结果

  4. 使用引号:处理包含空格的字符串

  5. 变量命名:使用有意义的变量名

  6. 代码缩进:保持代码整洁易读

  7. 测试脚本:在不同环境下测试

总结

        Shell 脚本是 Linux 系统管理和自动化的重要工具。通过掌握变量、字符串、参数传递和运算符等基础知识,你可以编写出强大的自动化脚本,提高工作效率。

下一步学习建议:

  • 条件语句(if-else)

  • 循环语句(for、while)

  • 函数定义和使用

  • 文件操作和文本处理

  • 错误处理和调试技巧

开始编写你的第一个 Shell 脚本吧!

http://www.dtcms.com/a/355971.html

相关文章:

  • HFSS许可证与版本兼容性
  • 智慧清洁革命:有鹿机器人如何重塑三大行业未来
  • AbpvNext问题记录——post接口,接收前端发送的空串转换数字异常问题。
  • Orgin绘制热力图
  • 财务报表包括哪些?一文讲清财务三大表
  • DMN6140L-13 电子元器件 Diodes美台N沟道增强型功率MOSFET
  • Codeforces Round 1043 (Div. 3) E. Arithmetics Competition
  • docker搭建Apisix和Apisix Dashboard
  • 智能仪表板DevExpress Dashboard v25.1新版亮点:增强数据管理功能
  • rk键盘 用蓝牙链接 教程
  • 实战演练(一):从零构建一个功能完备的Todo List应用
  • C++(Qt)软件调试---vcpkg安装crashpad(34)
  • 金融Agent+LLM的特性分析与调研
  • C#并行计算(SIMD)应用
  • illustrator-02
  • 洛谷 P2568 GCD-提高+/省选−
  • 「Java EE开发指南」如何使用MyEclipse启用自动JSP验证?
  • C语言————函数递归(通俗易懂)
  • logcat 网络日志解析
  • 二、开关电源的EMC改善措施
  • Python Imaging Library (PIL) 全面指南:PIL基础入门-图像处理与数据预处理
  • Maven 编译打包一个比较有趣的问题
  • yolo学习笔记01——前置基础
  • 【力扣】2715. 执行可取消的延迟函数
  • 生产环境Vue组件报错:Cannot access before initialization
  • 将 agents 连接到 Elasticsearch 使用模型上下文协议 - docker
  • 前后端分离情况下,将本地vue项目和Laravel项目以及mysql放到自己的云服务器
  • 工业 5G + AI:智能制造的未来引擎
  • Mybatis-增删改查
  • 逻辑回归以及损失函数