Shell 编程核心基础:输入输出与运算详解
一、引言
在 Linux 系统管理与自动化运维领域,Shell 脚本凭借其强大的灵活性与高效性成为必备技能。其中,输入输出处理与数据运算是 Shell 编程的核心基础,掌握这些知识能让脚本实现数据交互、文件操作及逻辑计算等关键功能。
二、输入输出核心操作
2.1 重定向:精准控制数据流向
重定向用于改变命令的输入输出源,分为覆盖式与追加式两类:
覆盖式重定向(> / <)
# 将echo内容覆盖写入文件
echo "file1.txt" > file.txt
# 从文件读取内容作为命令输入
cat < file.txt
追加式重定向(>> / <<)
# 追加内容到文件末尾
echo "file2.txt" >> file.txt
# 多行内容追加(EOF分界符)
cat << EOF >> config.ini
[db]
host=127.0.0.1
port=3306
EOF
2.2 管道符:命令间的数据桥梁
管道符 |
用于将前一个命令的输出作为后一个命令的输入,实现流水线处理:
# 过滤环境变量中的SHELL信息
env | grep SHELL
# 统计当前目录文件数
ls -l | wc -l
2.3 后台执行:释放终端资源
&
符号可将命令置于后台执行,避免阻塞终端:
# 前台执行(阻塞4秒)
sleep 4
# 后台执行(立即返回)
sleep 10 &
# 查看后台进程
ps aux | grep sleep
2.4 EOF:动态生成格式化内容
EOF(End of File)用于在脚本中生成带格式的多行内容,支持自定义分界符:
# 生成请假条(注意EOF需顶格)
cat << EOF
=================请假条=================
尊敬的王老师:
我因身体不适,需请假1天。
请假人:张三 日期:2023-10-01
EOF
- 技巧:使用
<<-
可自动忽略 EOF 前的制表符(Tab),方便代码缩进。
三、输出格式化:让信息清晰易读
3.1 echo:灵活的输出工具
- 常用选项
-n
:不自动换行-e
:启用转义字符(如\n
换行、\t
制表符)
echo -e "姓名:张三\n年龄:25\t职位:运维工程师"
颜色控制
通过转义序列 \033[背景色;字体色m
设置颜色(结尾用 \033[0m
恢复默认):
echo -e "\033[41;37m 红底白字警告! \033[0m"
颜色代码表:
颜色 | 字体色(3x) | 背景色(4x) |
---|---|---|
黑色 | 30 | 40 |
红色 | 31 | 41 |
绿色 | 32 | 42 |
黄色 | 33 | 43 |
四、数据运算:让脚本动起来
4.1 整数运算:基础算术操作
- 运算符:
+
(加)、-
(减)、*
(乘)、/
(除)、%
(取余) - 计算方式
$((表达式))
:最常用,支持变量与运算符
a=10
b=3
echo $((a * b + 5)) # 输出35
let
命令:直接对变量赋值
let "c = a * b + 5"
echo $c # 输出35
expr
命令:需转义乘号 *
expr $a \* $b + 5 # 输出35
4.2 赋值运算:简化变量操作
- 复合赋值:
+=
、-=
、*=
、/=
、%=
a=5
a+=3 # 等价于 a=a+3,结果8
a*=2 # 等价于 a=a*2,结果16
自增 / 自减:++
、--
(前置 / 后置不影响数值结果)
a=5 echo $((a++)) # 输出5,a变为6
echo $((++a)) # 输出7,a变为7
4.3 案例:鸡兔同笼问题
需求:已知头数 h
和脚数 f
,计算鸡兔数量。
脚本:
#!/bin/bash
h=$1 # 头数
f=$2 # 脚数
rabbit=$(( (f - 2*h) / 2 )) # 兔的数量
chicken=$(( h - rabbit )) # 鸡的数量
echo "鸡:$chicken 只,兔:$rabbit 只"
执行:
bash script.sh 30 88 # 输出:鸡:16 只,兔:14 只