Shell 学习基础
1、组合命令的符号
- 管道,将前面一个命令的结果作为后面一个命令的输入
- 分号,顺序执行用分号分割的命令
重定向,重定向包括三种:输入重定向、输出重定向、错误重定向,以7个不同的符号实现
<
:输入重定向>
:输出重定向>>
:输出重定向,但以追加的方式写入2>
:错误重定向2>>
:错误重定向,但以追加的方式写入&>
:重定向输出和错误&>>
:重定向输出和错误,但以追加的方式写入
2、变量
变量的基本操作:
变量的定义格式:变量名=变量值
变量的引用格式:$变量名、${变量名}脚本内的特殊变量
$n
:表示第n个参数$*
:表示所有参数$#
:标识传入脚本的所有参数个数$?
:标识上一条命令的返回值三种定界符的区别:单引号、双引号、反撇号
单引号:禁止引用和转义,即所有的符号都是所见即所得
双引号:允许引用和转义,即双引号中的变量会替换为变量的值 反撇号:以命令输出进行替换,即反撇号中的内容会替换为执行它的结果执行变量内的命令
当我们需要在脚本中执行多次同样的命令时,可以将该命令放入一个变量中,然后每次使用该变量执行命令即可。
eval ${CMD}
3、算术运算
- 整数运算 使用
expr
命令,计算表达式,格式:expr 数值1 操作符 数值2,对变量的引用需$
使用$[]
表达式,算式替换,格式:$[数值1 操作符 数值2],对变量的引用可以不加$
- 几个数值处理技巧 变量的递更处理,格式:let 变量名++、let 变量名-- 使用随机数,格式:RANDOM 变量 生成数字序列,格式:seq 首数 末数、seq 首数 增量 末数
- 小数运算 shell本身没有提供小数运算,需要依靠管道来使用另外一个命令bc
4、字符串操作
- 字符串截取 路径分割:dirname命令、basename命令 使用expr命令:
expr substr $var1
起始位置 截取长度,起始位置以1开始 使用${}表达式:${var:起始位置:截取长度}
,起始位置以0开始 - 字符串替换 使用${}表达式:
${var/old/new}
替换第一个old为new和${var//old/new}
替换所有的old为new - 使用随机字符串
5、条件测试
- 测试操作规范 测试操作本质上也是一个命令,它的作用就是用来判断一个条件的,格式1:
test 条件表达式
,格式2:[ 条件表达式 ]
,注意条件表达式和[]
之间的空格 - 文件状态的检测
-e
:文件或目录是否存在-d
:是否为目录-f
:是否为文件-r
:是否可读-w
:是否可写-x
:是否可执行 - 整数值比较
-eq
:等于(equal)-ne
:不等于(not equal)-gt
:大于(greater than)-lt
:小于(lesser than)-ge
:大于等于(greater or equal)-le
:小于等于(lesser or equal) - 字符串匹配
=
:判断两个字符串是否相等!=
:判断两个字符串是否不相等
6、if 判断结构
1.单分支结构:
if 条件测试then 命令序列fi
2.双分支结构:
if 条件测试then 命令序列1else 命令序列2fi
3.多分枝结构:
if 条件测试1then 命令序列1elif 条件测试2then 命令序列2...else 命令序列nfi
7、for 循环
语法结构:
for 变量名 in 取值列表do 命令序列done
取值列表用空白符分割,示例:
for i in 1 2 3 4 5do echo $idone
输出结果:
12345
8、case 分支
语法结构:
case 变量值 in模式1) 命令序列1 ;;模式2) 命令序列2 ;;...*) 默认命令序列esac
9、awk 工具
- 语法格式:
awk '模式 {操作}' 文件1 文件2 ...
- 常用内置变量:
NR
:当前处理行的序号(行号)FS
:字段分隔符,默认为空格或tab$0
:当前行的所有内容$n
:当前行第n个字段
10、sed 工具
- 语法格式:
sed '编辑指令' 文件1 文件2 ...
sed -n '编辑指令' 文件1 文件2 ...
不输出指令不影响的数据sed -i '编辑指令' 文件1 文件2 ...
直接修改文件 - 编辑指令写法:
[地址1[,地址2]]操作类型
多条指令之间以分号隔开,是指编辑指令,例如:sed -n '3p;5p' test.dat
- 常用操作类型:
p
:输出文本行n
:取下一行文本(跳过当前行)d
:删除s
:字符串替换a
:追加新文本
10、参数
$n:取传给函数或者脚本的第n个参数(n从0开始),当大于9时,需要用大括号括起来,${10}
$0:脚本的名称 $@:所有参数 $:所有参数,当以""包括时,$是一个整体,$@是分开的 $#:参数个数 $$:当前shell的进程ID