-
bash的定位与优势 -
定义:bash(GNU Bourne Again Shell)是Linux/Unix系统中常用的shell,兼容Bourne shell(sh),兼具编程特性和用户交互便利性。 -
优势:无处不在、开源、支持复杂脚本逻辑、兼容POSIX标准。 -
安装与配置 -
安装:大多数Linux发行版默认安装,可通过包管理器(如apt、yum)更新;其他系统(如BSD、macOS、Windows)需手动安装或通过Cygwin等工具支持。 -
配置:通过修改.bashrc、.bash_profile等文件自定义环境变量、提示符、别名等。 -
基本操作与提示符 -
提示符:默认$(普通用户)或#(root用户),可通过PS1变量自定义(如显示用户名、主机名、当前目录)。 -
命令执行:直接输入命令,bash通过$PATH变量查找可执行文件;使用./执行当前目录脚本。
-
标准输出(STDOUT) -
重定向: -
> file:覆盖写入文件。 -
>> file:追加写入文件。 -
2> file:重定向错误输出(STDERR)到文件。 -
&> file或> file 2>&1:同时重定向STDOUT和STDERR到文件。 -
工具: -
echo:输出文本,-n抑制换行,-e支持转义字符。 -
printf:格式化输出,类似C语言printf,支持格式字符串(如%s、%d)。 -
tee:将输出同时写入文件和标准输出,用于调试或日志。 -
标准输入(STDIN) -
重定向: < file从文件读取输入,<< EOF(here-document)在脚本内嵌入输入内容。 -
读取输入:read命令获取用户输入,支持-p提示、-s隐藏输入(如密码)、-t超时设置。 -
管道与过滤器 -
管道(|):将前一命令的输出作为后一命令的输入(如ls | grep ".txt")。 -
常用过滤器: -
grep:搜索字符串,支持正则表达式(如-i不区分大小写,-v排除匹配)。 -
sed:流文本编辑,支持替换、删除、插入(如s/old/new/)。 -
awk:文本处理语言,按字段解析数据(如awk '{print $1}')。
-
变量类型与定义 -
类型:默认字符串类型,可通过declare -i声明整数,declare -a声明数组。 -
定义:VAR=value(等号两侧无空格),引用时$VAR或${VAR}(避免歧义)。 -
特殊变量与参数 -
位置参数:$1、$2…$9,$0为脚本名,$*(所有参数作为整体)、$@(每个参数单独处理)。 -
内置变量:$#(参数数量)、$?(上一命令退出状态,0为成功)、$HOME(用户主目录)等。 -
变量操作 -
替换: -
${VAR:-default}:VAR为空时取默认值。 -
${VAR:=default}:VAR为空时赋值默认值。 -
${VAR#pattern}:删除匹配pattern的最短前缀,${VAR%%pattern}删除最长后缀。 -
数组:ARRAY=(item1 item2),访问${ARRAY[0]},遍历for item in ${ARRAY[@]}。
-
条件判断 -
test命令/[ ]: -
数值比较:-eq(等于)、-lt(小于)、-gt(大于)。 -
字符串比较:= (等于)、!=(不等于)、-z(为空)。 -
文件测试:-f(普通文件)、-d(目录)、-r(可读)。 -
[[ ]]复合命令:支持正则匹配(=~)、逻辑运算符(&&、||),更灵活。 -
循环结构 -
for循环: -
遍历列表:for var in item1 item2; do ... done。 -
计数循环:for ((i=0; i<10; i++)); do ... done(类似C语言)。 -
while循环:while condition; do ... done,适用于不确定次数的循环。 -
until循环:until condition; do ... done(条件为假时执行循环)。 -
分支结构 🌟 if [ condition ]; then
command1
elif [ condition2 ]; then
command2
else
command3fi⚽ case $VAR in
pattern1) command1 ;;
pattern2) command2 ;;
*) default ;;esac -
case语句:用于多条件匹配,如: -
if-else:
-
文本处理工具 -
grep:搜索文本,支持正则表达式(如grep -r "keyword" /path递归搜索)。 -
sed:流式编辑,如sed 's/old/new/g' file替换所有匹配项。 -
awk:按字段处理数据,如awk -F',' '{print $1}' file以逗号分隔字段并输出第一列。 -
文件操作工具 -
find:按条件查找文件(如find /path -name "*.txt" -size +10M)。 -
locate/slocate:通过数据库快速查找文件(需定期更新数据库)。 -
sort/uniq:排序和去重(如sort file | uniq)。 -
进程与任务管理 -
后台运行:命令后加&,如command &。 -
作业控制:fg( foreground)、bg(background)、kill %1(终止作业1)。
-
安全实践 -
路径安全:避免将.加入$PATH,防止恶意脚本执行;使用绝对路径或./明确脚本位置。 -
输入验证:对用户输入进行过滤,避免命令注入(如使用printf而非eval)。 -
文件权限:合理设置umask,避免敏感文件权限过大;使用set -e(命令失败时退出脚本)。 -
高级编程技巧 🏆 function_name() {
commands
return 0 # 返回状态码} -
函数定义:
-
陷阱(trap):捕获信号(如trap 'echo "退出前清理" ; exit 1' SIGINT SIGTERM)。 -
可移植性:使用#!/usr/bin/env bash而非固定路径,兼容不同系统。
-
网络重定向:bash支持网络套接字重定向(如exec 3<> /dev/tcp/host/port)。 -
系统日志:使用logger命令写入系统日志(logger "脚本运行中")。
-
常见场景实例 -
文件批量处理:用for循环遍历文件,结合mv、rm、cp等命令重命名或处理文件。 -
日志分析:用grep、awk过滤日志,提取关键信息(如错误日志统计)。 -
交互式脚本:用select创建简单菜单,用户输入选项执行对应操作。 -
性能与优化 -
避免多余的子进程(如用[[ ]]替代test)。 -
使用shift丢弃已处理的参数,减少循环中的变量操作。 -
文档与调试 -
注释:用#添加注释,说明脚本目的、参数、注意事项。 -
调试:使用set -x显示执行的命令,set -e检测错误,trap捕获异常。
原文始发于微信公众号(运维星火燎原):Linux shell 脚本编程
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论