• 忘掉天地
  • 仿佛也想不起自己
  • 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2024-08-07 15:14 Aet 隐藏边栏 |   抢沙发  4 
文章评分 1 次,平均分 5.0

基本语法

Shebang

注释

变量

  1. 变量名不能包含空格,等号两边也不能有空格
  2. 引用变量使用$符号

  1. 使用readonly命令将变量设置为只读

  1. 使用unset删除变量

字符串

  1. 单引号内的内容原样输出,变量不会被解析

  1. 双引号内的内容会解析变量和转义字符

  1. 获取字符串长度

  1. 字符串拼接

数组

  1. 定义数组并访问数组元素

  1. 获取数组长度

条件判断

case

循环

  1. for

  1. while

  1. until

函数

输入和输出

  1. 使用read命令读取用户输入,使用echo输出

重定向和管道

  1. 使用>>>进行输出重定向,使用进行管道操作

运算符

  1. 使用expr进行算术运算
  2. 或者使用双括号(( ))

  1. 关系运算符用于比较两个数

  1. 逻辑运算符用于逻辑判断

进阶内容1

更复杂的变量处理

  1. 参数替换用于处理变量的默认值、替换值等

  1. 对字符串进行子串提取和替换

高级控制结构

  1. 使用select创建菜单

  1. 复合命令

错误处理

  1. 使用$?检查上一个命令的退出状态

  1. trap用于捕获和处理信号

  1. 使用set命令开启错误处理选项

调试技巧

  1. 开启和关闭脚本的调试模式

  1. 在脚本中添加echo语句来打印变量值和调试信息

信号处理

  1. trap命令用于捕获和处理信号

子进程和后台作业

  1. 使用&将命令放入后台执行

  1. 使用wait等待后台作业完成

性能优化

  1. 尽量减少使用外部命令以减少子进程的开销

  1. 批量处理数据以减少重复的IO操作

进阶内容2

正则表达式

  1. 正则表达式在Shell中通常用于模式匹配
  2. 常用的工具有grepsedawk

命令替换

  1. 命令替换用于将命令的输出作为变量或参数的一部分
  2. 使用反引号

  1. 使用$()

环境变量管理

  1. 环境变量在Shell脚本中用于配置和传递信息
  2. 设置和导出环境变量

  1. 从环境变量中读取

  1. 查看所有环境变量

文件描述符操作

  1. 文件描述符用于管理输入输出流
  2. 重定向标准输出和标准错误

  1. 使用文件描述符

流程控制

  1. breakcontinue

  1. eval用于执行构造的命令

复杂数据处理

  1. 使用awk进行字段处理

  1. 使用sed进行多行处理

动态参数处理

  1. 使用shift命令处理脚本中的参数

学习理解

数据类型相关

  1. Shell脚本中,所有变量和数组元素实际上都是字符串
    1. 即使看起来是整数或其他类型,它们在内部仍然作为字符串处理
    2. 换句话说,Shell脚本中的变量没有明确的类型声明
      所以你可以在数组中混合字符串和看起来像整数的值

  1. 即使数组中的元素看起来像整数,它们在执行数值操作时仍然需要显式转换
    1. 例如,使用$(( ))来进行算术运算

  1. 虽然Shell本身不支持类型检查,但你可以使用一些技巧来判断一个变量是否是整数
    1. 例如,使用正则表达式匹配

信号捕获相关

  1. 通过设置trap命令,可以在信号到达时执行指定的命令或动作,而不是终止脚本的默认行为
    1. commands:指定当捕获到信号时要执行的命令
    2. signal:指定要捕获的信号名称或编号

  1. 捕获信号的机制
    1. Shell会在执行脚本的过程中,检查是否收到了指定的信号
    2. 如果收到了信号,Shell会暂停当前的操作,执行trap命令中指定的命令,然后继续执行剩余的脚本
    3. 这是由Shell的内部实现机制决定的

关于环境变量

  1. 局部变量在当前Shell会话或脚本中有效,通常在脚本结束时自动销毁
    1. 这个变量在当前脚本或会话中有效,但不会影响其他脚本或Shell会话

  1. 全局环境变量在所有子Shell会话中有效
    1. 要设置全局环境变量,可以使用export命令
    2. 通过export命令将变量导出,使其在当前Shell会话及其子进程中都可见

  1. 设置全局环境变量影响其他Shell脚本
    1. 如果希望设置的环境变量在整个系统或所有终端会话中都有效,可以将变量定义添加到用户的配置文件中
    2. 比如~/.bashrc~/.bash_profile

关于动态参数处理

  1. $#是一个特殊变量,表示传递给脚本的参数数量
  2. $1表示当前第一个参数
    1. 从参数列表中第一个
  3. -f|--file)
    1. 这是一个模式,匹配参数-f--file
    2. -f:短选项,表示文件
    3. --file:长选项,表示文件
  4. FILE=$2
    1. 将下一个参数(即文件名)赋值给变量FILE
    2. 从参数列表中第二个
  5. shift 2
    1. 移动参数位置,将前两个参数从列表中移除
  6. -v|--verbose)
    1. -v:短选项,表示详细模式
    2. --verbose:长选项,表示详细模式
  7. VERBOSE=1
    1. 1赋值给变量VERBOSE,表示启用详细模式
  8. shift
    1. 没有参数的shift默认移动一个位置
  9. --)
    1. 这是一个特殊模式,匹配双破折号--,表示参数的结束
    2. --:表示参数列表的结束,后续参数不会再作为选项处理

grep

概述

  1. 一个强大的命令行工具,用于在文件或输入流中搜索匹配特定模式的文本行
  2. grep 的强大之处在于它对正则表达式的支持

基本用法

常用选项

  1. -i:忽略大小写
  2. -v:反转匹配,显示不包含模式的行
  3. -w:匹配整个单词
  4. -x:匹配整行

输出选项

  1. -n:显示匹配行的行号
  2. -l:只显示包含匹配模式的文件名
  3. -c:只显示匹配的行数
  4. -o:只显示匹配的部分

扩展选项

  1. -E:使用扩展的正则表达式(等价于 egrep
  2. -F:使用固定字符串匹配(等价于 fgrep
  3. -P:使用Perl兼容的正则表达式

正则表达式

  1. .:匹配任意单个字符
  2. *:匹配零个或多个前面的字符
  3. ^:匹配行的开头
  4. $:匹配行的结尾
  5. [ ]:匹配括号内的任意一个字符
  6. ( ):分组,用于匹配子模式
  7. \:或操作符,用于匹配任意一个模式

实战示例

  1. 查找包含特定单词的文件

  1. 统计包含特定模式的行数

  1. 提取特定模式的行

  1. 组合使用
    1. 可以将 grep 与其他命令组合使用,如 sortuniq

sed

概述

  1. 一个强大的流编辑器,用于对文本进行非交互式的编辑和处理
  2. 它常用于替换文本、删除文本、插入文本以及执行复杂的文本操作

基本用法

替换文本

  1. 替换命令是 sed 最常用的命令之一,使用 s 进行替换

删除文本

  1. 删除命令是 d,用于删除匹配的行

插入和追加文本

  1. 插入命令是 i,追加命令是 a

组合命令

  1. 可以使用 -e 选项组合多个命令

  1. 或者将命令放在脚本文件中,然后使用 -f 选项

地址范围

  1. sed 命令可以作用于特定的行范围或模式范围

高级用法

  1. sed 有两个工作空间:模式空间和保留空间
    1. 可以使用保留空间进行复杂的文本处理

  1. 使用不同的分隔符代替斜杠

示例

  1. 替换字符串

  1. 删除空行

  1. 在特定行之前插入文本

  1. 从文件中删除特定行范围

  1. 替换特定行范围中的文本

  1. 从标准输入读取并替换文本

awk

概述

  1. 是一个功能强大的文本处理工具,用于在命令行或脚本中对文本文件进行格式化、提取和处理
  2. awk 的强大之处在于它能够基于模式匹配和特定的字段操作来处理数据

基本用法

  1. 打印文件内容
    1. { print $0 }:打印整行,$0 代表当前行的所有内容

  1. 打印特定字段
    1. { print $1 }:打印第一列,$1 代表当前行的第一个字段

常用模式

  1. 匹配特定模式的行
    1. /John/:匹配包含 John 的行

  1. 匹配特定条件的行
    1. $3 > 25:匹配第三个字段大于 25 的行

内置变量

  1. NR:当前记录的行号
  2. NF:当前记录的字段数
  3. FS:输入字段分隔符,默认为空格或制表符
  4. OFS:输出字段分隔符,默认为空格
  5. RS:输入记录分隔符,默认为换行符
  6. ORS:输出记录分隔符,默认为换行符

字符串操作

  1. 连接字符串

  1. 字符串长度

数值操作

  1. 计算每行的总和

  1. 计算所有数的总和

条件语句

  1. if

  1. if-else

循环

  1. 使用 for 循环遍历字段

自定义函数

  1. awk 中定义并使用函数

示例1

  1. 处理 CSV 文件
    1. 假设有一个 CSV 文件 data.csv,内容如下

  1. 打印每个人的名字和年龄
    1. -F,:指定字段分隔符为逗号

示例2

  1. 假设有一个文件 words.txt,内容如下:

  1. 查找并打印最长的单词

gawk

概述

  1. gawk 是 GNU 版本的 awk,它扩展了标准 awk 的功能,提供了更多的内置函数和特性,使文本处理和数据分析更加强大
  2. gawkawk 的基本用法相同,但增加了许多高级特性

扩展的字符串函数

  1. tolower(str):将字符串 str 转换为小写
  2. toupper(str):将字符串 str 转换为大写
  3. gsub(regex, replacement, [target]):全局替换 target 中匹配 regex 的部分为 replacement</li> <li>sub(regex, replacement, [target]):替换 target 中首次匹配 regex 的部分为 replacement
  4. sprintf(format, expression, ...):返回格式化字符串

扩展的数值函数

  1. sin(x):返回 x 的正弦值
  2. cos(x):返回 x 的余弦值
  3. sqrt(x):返回 x 的平方根
  4. exp(x):返回 ex 次幂
  5. log(x):返回 x 的自然对数

数据排序

  1. 在内存中对数据进行排序

多维数组

  1. 支持关联数组和多维数组

时间函数

  1. systime():返回当前时间的时间戳
  2. strftime(format, [timestamp]):格式化时间戳

使用内置库

  1. 包含了一些内置库,可以通过 @include 关键字使用

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享