Shell 脚本编程完全指南
前言
在当今的计算机世界中,自动化已成为提高效率和减少重复工作的关键。无论是系统管理员、开发人员还是数据分析师,掌握 Shell 脚本编程都是一项极其有价值的技能。Shell 脚本作为 Linux 和 Unix 系统的"粘合剂",能够将各种命令和工具巧妙地组合起来,完成复杂的任务。
为什么学习 Shell 脚本?
高效自动化:通过编写脚本,可以将繁琐的重复性工作自动化,节省大量时间和精力
系统管理:是 Linux 系统管理的必备技能,用于监控、备份、部署等任务
强大灵活:能够调用系统所有命令和工具,功能几乎无限
快速原型:适合快速验证想法和编写工具原型
跨平台:大多数 Unix-like 系统都支持 Shell 脚本
学习目标:
通过本文,你将学会:
创建和执行你的第一个 Shell 脚本
理解和使用变量、字符串操作
掌握参数传递和命令行交互
熟练运用各种运算符进行数学和逻辑运算
编写实用的自动化脚本解决实际问题
无论你是想要自动化日常任务,还是希望深入理解 Linux 系统工作原理,Shell 脚本都是你必须掌握的技能。让我们开始这段有趣的学习之旅,探索 Shell 脚本的强大功能吧!
1 Shell 脚本
1.1 创建脚本文件
vim 【文件名.sh】 进入配置文件 ------------------------ #!/bin/bash echo "Hello, World!" echo "你好,今天过得怎么样"
#!/bin/bash
:shebang,指定解释器# 注释
:注释内容,不会被执⾏echo
:输出命令
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 为什么需要变量
代码重用:一次定义,多次使用
易于维护:修改数据只需修改变量值
提高可读性:有意义的变量名让代码更易懂
动态处理:可以根据需要改变存储的值
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. 最佳实践
添加 shebang:总是以
#!/bin/bash
开头使用注释:解释代码功能
错误检查:检查命令执行结果
使用引号:处理包含空格的字符串
变量命名:使用有意义的变量名
代码缩进:保持代码整洁易读
测试脚本:在不同环境下测试
总结
Shell 脚本是 Linux 系统管理和自动化的重要工具。通过掌握变量、字符串、参数传递和运算符等基础知识,你可以编写出强大的自动化脚本,提高工作效率。
下一步学习建议:
条件语句(if-else)
循环语句(for、while)
函数定义和使用
文件操作和文本处理
错误处理和调试技巧
开始编写你的第一个 Shell 脚本吧!