一、Shell的本质与价值
1.1 什么是Shell?
Shell是用户与操作系统内核之间的桥梁,具备双重角色:
-
命令解释器:直接执行用户输入的命令(
ls
,grep
等) -
脚本引擎:解释执行预编写的脚本文件
常见Shell类型:
Bash (Bourne Again Shell) # Linux默认Shell
Zsh # 强大的交互式Shell
Ksh # 兼容性强的商业Shell
1.2 Shell的应用场景
-
自动化运维(日志分析/备份)
-
持续集成(CI/CD流水线)
-
快速原型开发
-
系统监控与告警
二、Shell的输入输出
2.1 echo 输出
echo "hello" 将字符直接输出到终端
echo "hello1" "hello2" 输出两个
echo -n "hello" 取消回车
echo $变量名 输出变量
2.2 read 输入
read 变量 从键盘中读取内容赋值给变量
read X1 X2 X3 读取多个值并用空格隔开
$ echo "hello"
$ read num
123
$ echo $num
123
三、变量操作精要
3.1 变量基础
name="Alice" # 定义变量
echo $name # 输出变量值
readonly PI=3.14 # 定义只读变量
unset name # 删除变量
3.2 环境变量
echo $PATH # 查看系统路径变量
export API_KEY="123" # 设置环境变量
3.3 特殊变量
$0 脚本名称
$1 第一个参数
$# 参数个数
$* 所有参数
$? 上条命令返回值
四、数组操作大全
4.1 数组定义与访问
colors=("red" "green" "blue") # 声明数组
echo ${colors[1]} # 访问第二个元素 → green
colors[3]="yellow" # 添加新元素
4.2 数组操作技巧
echo ${colors[@]} # 所有元素
echo ${#colors[@]} # 数组长度
echo ${!colors[@]} # 获取所有索引
# 遍历数组
for color in "${colors[@]}"; do
echo $color
done
五、功能性语句
5.1 测试性语句格式
格式1:test 测试条件
格式2:[测试条件]
举例:
if test "string1" = "string2" ; then
echo "字符相等"
fi
str_1="张三"
str_2="张三"
if test $str_1 = $str_2; then
echo "字符相等"
fi
if [ "string1" = "string2" ]; then
echo "字符相等"
fi
5.2 测试条件
(1) 字符串对象(一定要注意在进行字符串的判断的时候都需要加上"", “$a" "hello"
-z 判断字符串是否为空
-n 判断字符串是否为非空
=或-- 都是用来判读字符串是否相等
!= 不等于
l> 大于(防止误认为重定向)
l< 小于
(2) 数字对象
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
(3) 文件属性
-b filename 检测文件是否为块设备,如果是则返回真
-c filename 检测是否是字符设备文件,如果是则返回真
-d filename 判断文件是否是目录,如果是则返回真
-p filename 检测文件是否是管道文件,如果是则返回真
-f filename 检测文件是否是普通文件,如果是则返回真
-x filename 检测文件是否是可执行文件,如果是则返回真
-L filename 判断文件是否存在,是否是链接文件(经测试链接文件也是-S filename判断文件是否存在,是否是套接字文件
-s filename 判断文件是否存在,判断文件是否为空
-e filename 判断文件是否存在
(4) 文件权限
-r filename 判断文件是否存在,是否有可读权限
-w filename 判断文件是否存在,是否有可写权限
-x filename 判断文件是否存在,是否有可执行权限
(5) 文件比较
-nt 文件是否更新
-ot 文件是否更旧
-ef 文件的inode是否一致
(6)逻辑运算
-a 与 &&
-o 或 ||
! 非
六、流程控制语句
6.1 条件判断
if [ $num -gt 10 ]; then
echo "大于10"
elif [ $num -eq 10 ]; then
echo "等于10"
else
echo "小于10"
fi
6.2 循环结构
# for循环
for i in {1..5}; do
echo "Number $i"
done
# while循环
count=1
while [ $count -le 3 ]; do
echo "Count: $count"
((count++))
done
6.3 Case语句
case $OS in
"Linux")
echo "使用apt/yum"
;;
"MacOS")
echo "使用brew"
;;
*)
echo "未知系统"
;;
esac
七、函数编程实践
7.1 函数基础
greet() {
local name=$1 # 局部变量
echo "Hello, $name"
}
greet "Alice" # 调用函数
7.2 返回值处理
add() {
return $(($1 + $2))
}
add 3 5
echo "结果: $?" # 输出8
八、算术运算
8.1 整数运算
8.1.1 双括号法(推荐)
a=10
b=3
echo "加法:$((a + b))" # 13
echo "取余:$((a % b))" # 1
8.1.2 let命令
let result=5+3
echo "5 + 3 = $result"
let result=10-4
echo "10 - 4 = $result"
let result=6*2
echo "6*2 = $result"
let result=20/4
echo "20 / 4 = $result"
let result=13%5
echo "13 % 5 = $result"
8.1.3 expr命令
num_1=$ (expr 5 +3)
8.2 浮点数运算(需借助bc
)
# 数值比较
if (( $num % 2 == 0 )); then
echo "偶数"
fi
# 浮点运算
area=$(echo "scale=2; 3.14 * $r * $r" | bc)
Shell脚本通过简洁的语法实现了强大的系统管理能力。掌握变量、数组、流程控制和算术运算,可大幅提升自动化任务的效率。建议结合实战项目(如日志分析、定时任务)加深理解。掌握这些核心概念后,您已经可以编写高效的Shell脚本来自动化日常任务。记住:实践是最好的老师,多写多调试才能真正掌握Shell编程的精髓!