shell内置计算命令:
expr命令:整形、字符串
整形:
expr 运算表达式 (表达式各元素需空格隔开,部分运算符需转义)
字符串:
expr lenth 字符串:求字符串的长度
expr substr 字符串 start end:截取字符串
start:截取起始位置,从1开始
end:截取结束位置,包含该位置
expr index 字符串 需定位字符:找出指定字符第一次出现在字符串的位置
expr match 字符串 正则表达式:通过正则表达式匹配字符
等价于:expr 字符串:正则表达式
(( ))命令:双小括号,进行整数运算
((表达式)):有无空格隔开都可以,符号也不需要转义
在运算后可在括号内进行赋值:((新变量名=运算表达式))
也可用$读取运算结果后在赋值,新变量名=$((运算表达式))
可同时操作多个运算表达式:((表达式1 ,表达式2,...)) 逗号隔开
let命令:整形运算(常用于运算后赋值给新变量)
let命令仅能用于赋值计算,不能直接输出,也不可用于条件判断(与(())的区别)
let 赋值语句 等价于(( 表达式 ))
同时操作多个语句时,使用空格隔开:let 赋值运算语句1 赋值运算语句2 ...
$[ ]命令:只能对单个表达式求值和输出
各命令优缺:
expr :直接输出,但表达式各元素需空格隔开,部分操作符需转义,只能执行单表达式
表达式里面引用变量需使用$
(( )):可直接使用变量名,字符不需要转义,可执行多个表达式,结果不能直接输出
需被取值后,才可输出
let:赋值简单(常用),字符不需要转义,但不能直接输出,不能用于条件判断
$[ ]:字符不需要转义,但只能执行单个表达式
计算命令bc:简单的计算器
互动式的数学运算:
bc命令:可进行进制转换和计算(二、八、十、十六)
可进行整形运算,也可进行浮点运算(加减乘除、指数、余数等)
语法:bc 操作选项 参数
输入 quit 退出bc命令
操作选项:
-h:帮助信息,可显示各操作选项对应的功能说明
-l:使用标准数学库。eg:内置函数的使用
-q:不显示欢迎信息(默认执行bc命令时出现,可通过此取消)
参数:
可以是一个包含许多计算表达式(一个表达式一行)的文件
内置变量:(进入bc后使用)各内置变量之间用 ; 隔开,最后输入数字
scale:指定计算结果保留的小数位,默认为0 scale=数字
ibase:指定输入数的进制,默认十进制 ibase=数字
obase:指定输出数的进制,默认十进制 obase=数字
. 或 last:最近打印结果的数字
内置函数:(进入bc后使用)
s(弧度x):计算弧度x的正弦值
c(弧度x):计算弧度x的余弦值
a(弧度x):计算弧度x的正切值
l(x):计算x的自然对数
e(x):e的x次方
j(n,x):计算从n到x的阶数
shell中非互动式的管道运算:借助管道符 |
echo "表达式" | bc 操作选项
表达式必须符合bc命令要求,且里面可用 $引用shell的变量
将bc的计算结果赋值给shell变量:
1、反引号 ` `:变量名= ` echo "表达式" | bc 操作选项 `
2、$(echo "表达式" | bc 操作选项)
区别:
反引号 ` `:所有linux系统支持,兼容性好,但易混淆单引号 ' '
$( ):兼容性较差,但不同意混淆
shell中非互动式的输出重定向运算:使用 <<将表达式输入到bc中去执行
1、反引号 ` `
变量名=` bc 操作选项 <<EOF
第一行表达式
第二行表达式
...
EOF
`
2、$( )
变量名:$(bc 操作选项 <<EOF
第一行表达式
第二行表达式
...
EOF
)
PS:类似文件流的输入,EOF仅是自定义始末标识符,可任意,但前后需一致
流程控制语句:
if else语句:
1、只有if:
if 条件
then
命令...
fi
2、if else:
if 条件
then
命令
else
命令
fi
3、if elif else:
if 条件1
then
命令1
elif 条件2
then
命令2
else
命令N
fi
也可一行写完,各语句用 ;隔开 :if 条件;then 命令;fi
条件语句运用test内置命令:功能同 [ ]一致
对整形、字符、文件三方面操作
case语句:分支判断
case 值 in 匹配选项
匹配1)
命令...
;; ( 以俩个分号作为匹配项命令的结束)
匹配2)
命令...
;;
*) (*表示通配,相等与其它语言case的default)
命令...
;;
esac
可做条件匹配的正则表达式:
*:任意都匹配
[abc]:a、b、c当中任意一个
[m-n]:从m到n的任意字符,表示一个范围
|(或):多重选择
while语句:条件为false才退出循环
while 条件 (条件为 :或true时,死循环,快捷键ctrl+c退出)
do
命令1 (continue,break 同其它语言功能一样)
命令2...
done
单行格式:while 条件;do 命令;done;
until语句:相反的while,条件为true才退出循环
for语句:
1、
for 循环变量 in 枚举值 (枚举值决定循环次数,空格隔开)
do
命令...
done
单行写法:for 循环变量 in 枚举值;do 命令;done;
2、
for 循环变量 in {start..end} {整形1..整形2}:{ } 和 .. 为固定格式 ,表示范围
do
命令
done
单行写法:for 循环变量 in { start..end};do 命令;done;
3、同其它语言类似,但需要俩个 ()
for((循环变量=start;条件语句;循环变量变化语句))
do
命令
done
单行写法:for((循环变量=start;条件语句;循环变量变化语句));do 命令;done;
select语句:shell独有,用来增强交互性,常搭配case使用
select默认是死循环,输入空值或无效值都不会退出,
只有遇到break或快捷键 Ctrl+ d 才会退出
1、
select 循环变量 in 枚举列表
do
命令
done
2、搭配case使用
select 循环变量 in 枚举列表
do
case $循环变量 in
枚举1)
命令...
;;
枚举2)
命令...
;;
*)
命令
esac
done
shell函数:
系统函数:
1、basename:获取文件名
basename 文件路径 后缀 (后缀可选择删除提取的文件后缀)
2、dirname:去除文件名,获取文件前缀路径
dirname 文件绝对路径
自定义函数:
函数名()
{
命令...
return 返回值 (不设置return,默认将最后一条命令状态码返回)
}
调用函数:
函数名 参数1 参数2 ... (参数空格隔开)
$#:获取传递参数个数
$* 或 $@:将所有参数组成一个字符串
$$:当前脚本运行的ID号
$@加双引号:获取所有参数,组成一个数组,每个参数为一个元素
$?:命令执行状态码
shell程序(内部命令和外部脚本文件)和函数区别:
shell程序包括内部命令和外部脚本文件,外部脚本文件在子shell中运行,会开启独立进程
而shell函数在当前shell进程运行
shell重定向输入输出:覆盖> 追加>>
标准输入:键盘输入
标准输出:输出到显示器
shell每个命令执行时都会打开三个文件:
stdin:标准输入文件
stdout:标准输出文件
stderr:标准错误输出文件
三个文件的文件描述符发别为 0、1、2
重定向:改变输入输出的方向,不在从键盘输出,不在输出到显示器
作用:将命令结果输出到其它地方,可保存起来,随时查询
语法:
默认只会将正确的信息输出,输出错误信息需使用文件描述符
命令>文件路径:正确信息覆盖方式输出到文件
命令 >>文件路径:正确信息追加方式输出到文件
命令<文件路径:从文件读取信息给命令
命令<文件路径1>文件路径2:命令从文件1读取信息,将正确信息覆盖输出到文件2
命令 文件描述符> 文件路径:指定文件类型覆盖输出到文件(可输出错误信息)
命令 文件描述符>> 文件路径:指定文件类型追加输出到文件(可输出错误信息)
文件描述符 和> >> 中间不能存在空格
同从多个文件输入、输出,文件描述符和并:
PS:需要放在命令最后面,且描述符2需要在描述符1前面
语法:命令 输入/输出方式 文件路径 合并的文件描述符
文件描述符2>&文件描述符1:同时将正确信息和错误信息输出
文件描述符2<&文件描述符1:同时从标准输出文件、标准错误输出中输入
<< 自定义标识符:读取自定义标识符中间的内容,自定义标识符前后需一致
shell工具:
cut:切割提取指定列、字符、字节的数据
cut 操作选项 文件
操作选项:
-f 提取范围:获取第几列
-d 自定义分隔符:自定义分隔符,默认为制表符(以列提取才可用)
-c 提取范围:以字符为单位分隔
-b 提取范围:以字节为单位分割,可能将多字节字符割裂
-n:常与-b使用,保留多字节字符的完整性
提取范围:
n-:提取n 列 /字节 /字符 后所有数据
n-m:提取n列 /字节 /字符到m列 /字节 /字符的数据
-m:提取开始到m列 /字节 /字符的数据
n1,n2,...:提取n1,n2,...列 /字节 /字符的数据
sed:流编辑器 (stream editor)
非交互流式编辑器,一次处理一行内容,放入模式空间(缓存)。
可对每一行数据增删查改等操作,可按行、字符、正则表达式匹配文本内容。
语法:sed 操作选项 sed程序命令 文件
操作选项:
-e:一条命令上执行多个sed程序命令时使用,
-i:对文件内容直接修改,默认不会修改原文件内容
-f:将执行结果另存到新文件中
-n:取消默认输出文件内所有信息,只输出做了处理的行
-r:使用正则表达式时使用
sed程序命令:
a:在匹配行的下一行新增内容
sed ' 3a新增内容' 文件 :第三行后新增内容
sed ' /匹配内容/a内容' 文件:在匹配行后新增内容
i:在匹配行的前一行新增内容
c:修改匹配行的内容
sed ' 1c修改内容' 文件:将第一行修改为新内容
sed '/匹配内容/c修改内容' 文件:将有匹配内容的行全都修改
sed '$c修改内容' 文件:修改最后一行
s:替换行内匹配的内容,不匹配的不会变化(默认自会替换第一个)
sed 's/匹配内容/修改内容/2':将第二个匹配内容修改
sed 's/匹配内容/修改内容/g':将全部匹配内容修改
sed 's/$/& 拼接内容/' 文件:每行末尾拼接内容
sed 's/^/& 拼接内容/' 文件:每行行首拼接内容
d:删除匹配行
sed ' 1~2d' 文件 :从第一行开始隔俩行删除
sed '1,3d' 文件:删除第一到第三行
sed '! 1,3d' 文件 :除了第一到第三行,其余都删掉
sed ' /匹配内容/d' 文件:删除有匹配内容的行
p:打印匹配行内容,常与 操作选项 -n 一起使用
=:打印匹配行的行号
n:直接读取下一行
sed的模式空间和暂存空间(暂存空间开始只有空行)
h:模式空间内容覆盖到暂存空间
H:模式空间内容追加到暂存空间
g:暂存空间内容覆盖到模式空间
G:暂存空间内容追加到模式空间
x:交换俩个空间内容
sed '1h;$G' 文件:模式空间第一行覆盖到暂存空间,暂存空间内容追到模式空间
sed '1{h;d};$G' 文件:模式空间第一行覆盖到暂存空间后删除,暂存空间内容追到模式空间
sed '1,3H' 文件:模式空间第一到第三行追加到暂存空间
awk:文本分析
语法: awk '匹配模式{操作选项}' 文件
操作选项:
-F:指定文件拆分的分隔符
-v:赋值一个用户定义变量
awk内置变量:
FILE:文件名
NF:列号
NR:行号
$n:$0:整行信息 $1:第一列 $2:第二列 ...
$NF:最后一列
匹配模式:
BEGIN:添加开头信息
END:添加结尾信息
sort:排序
sort 操作选项 参数
操作选项:
-n:按照数值大小排序(默认小到大)
-r:相反的规则排序
-t:设置排序划分列的分隔符
-k:指定排序的列
-d:排序结果输出到指定文件
-u:去除重复(必须放在操作选项最后)
sort -t " " -k2n,2 文件:将文件内容第二列按照数值大小排列
sort -t " " -k2n,2 -uk1,2 文件:将文件排序同时将文件第一列、第二列都相同的重复行去除,保留一行
