【shell 编程学习笔记】二、基础概念2

8、bash的一些基础的内置命令:
echo:-n不换行输出;-e解析字符串中的特殊字符
printf:也是打印命令
eval:表示执行多个命令
exac:不创建子进程执行后续命令,且执行完毕后自动exit
export、read、shift

\n 换行
\r 回车
\t 制表符 四个空格
\b 退格
\ 反斜杠 ,特殊字符不想识别就用反斜杠,一般和双引号搭配。但是在单引号中就不用反斜杠了,因为单引号本来就是强引号,不识别特殊字符的。

9、shell变量的处理方法:
linux一切皆文件,所以我们最经常要做的就是处理文本,而文本可以以文件的形式存储、可以以变量的形式存储、也可以以数据交换等复杂的格式存在,我们现在学的就是怎么处理变量。就是比如怎样获取字符串、怎样截取字符串、统计字符串、匹配字符串等操作。 

写个for循环统计一下上述几种计算字符串长度的方法的时间: 

说明:shell编程时,我们要尽量用linux内置的命令、内置的操作、和内置的函数,效率最高,因为都是C语言开发的。同时要尽可能的减少管道符的操作。

  • 对变量值:字符串的截取和替换

# 从开头删除最短匹配信息
## 从开头删除最长匹配信息
% 从结尾删除最短匹配信息
%% 从结尾删除最长匹配信息

/只替换一次
//全部替换

指定字符内容的截取:a*c 匹配开头为a,中间任意个字符,结尾为c的字符串

  • 扩展变量:对变量值进行判断和处理
    (1)result=${bianliang:-fanhuizhi} :如果变量bianliang的值是空的,就是还没有定义这个变量或者定义了但没赋值,值是空的,那就返回-后面的字符串给result变量,同时bianliang变量还是空值。如果bianliang值非空,fanhuizhi就不赋值给bianliang,也不赋值给result,result的值就是bianliang的值。或者说就当-后面的内容不存在,bianliang的值还是原来的值,并且把bianliang的值赋值给result变量。
    (2)result=${bianliang:=fanhuizhi} :如果变量bianliang的值是空的,则用返回值fanhuizhi替代变量值。
    (3)result=${bianliang:?fanhuizhi} :如果变量bianliang的值是空的,则fanhuizhi当作stderr输出,否则输出变量值。用于设置变量为空导致错误时,返回错误信息。
    (4)result=${bianliang:+fanhuizhi} :如果变量bianliang的值是空的,什么都不做,否则返回fanhuizhi。

小结:前面3种只要bianliang有值,就当冒号后面的东西不存在。

10、例子:批量修改文件名

我们先生成一批空文件,然后任务是:先把所有的.jpg文件的_finished字符信息去掉,再把所有的.png文件都改名:

 思路:
(1)改文件名的命令是:mv 原文件名 新文件名
(2)任务:去掉_finished字符信息,我们可以先把文件名字符串赋值给一个变量,然后对变量进行字符串替换操作。比如:
var=lyy_1_finishied.jpg
echo ${var//_finished/}
两个斜杠表示全部替换,找到变量var的_finishied字符,然后用空替换,就是去掉_finishied字符信息。
(3)那怎么拿到文件名信息?用反引号。echo `ls` 是不是就出来了。
(4)批量替换就用for循环操作。

 11、例子:删除过期数据
任务:现在我们要删除7天以上的日志文件
思路:先用find找到要删除的文件,然后|xargs rm -f 删除即可。
那find要删除的文件怎么写?find的语法是:find 需要搜索的目录(就是你要在哪个目录下find) -name 你要找的文件名 -type 你要找的文件类型 -mtime +7就是大于7天的文件。

假如现在我们写一个脚本,脚本里面的内容就是下图中的那2行代码:

解读:
find xxx |xargs rm -f 表示find找到的东西丢给xargs,xargs用rm -f删除
${path:=/xxxt/xx/xxx} 表示find后面的路径我们用了一个变量path替代了,如果前面已经定义了path变量的值,就是设定了路径,那就直接在设定的路径下find,如果path没定义,就是path是空的,那:=xxxx就是给变量path替代一下,用xxx路径替代path的空值,这样代码更严谨。
-name '*.tar.gz' 是find的参数,表示找名字是*.tar.gz的压缩文件。
-type f 表示文件的类型是f文本类型的,因为压缩文件也是文本类型的。
-mtime +7 表示超过7天的文件。

12、父子shell
(1)查看父子shell的层级关系:

(2)为什么要父子shell

举个例子,假如我们现在在父shell中执行一个ping命令,那当前这个shell是不是就啥也干不成了,就开始无休无止的执行ping命令了,当前shell就不能进行其他操作了。其实在实际中,我们经常会遇到一些非常耗时的操作,我们又不能让这些耗时的操作阻碍我们其他的操作,此时,就需要开一个子shell,单独去执行这些耗时的操作,然后当前的shell该干啥还能干啥。

(3)如何创建子shell
创建子shell也就是创建进程列表。列表就是容器的概念,这个容器可以把数据包括起来,使用小括号()来表示。 

变量BASH_SUBSHELL是linux默认的一个有关shell的变量
当该变量的值=0,表示是在父shell环境中;
当该变量的值=1,表示在子shell中;
当该变量的值=2,表示在子子shell中;
以此类推。

那么,当我们用小括号嵌套小括号呢,就是子shell嵌套运行了:

小结:我们在shell脚本开发中,经常会用小括号(),开启子shell,进行多进程的处理,以提高程序并发执行效率。

14、linux的内置命令、外置命令
linux就是敲一些命令,对机器资源进行管理、服务启停、脚本编写等操作。但是这些命令还有内置外置之分。
内置命令:在系统启动时就加入内存,常驻内存,执行效率更高,但是占用资源。内置命令和shell是为一体的,是shell的一部分,不需要单独去读取某个文件,系统启动后,就执行在内存中了。
外置命令:系统需要从硬盘中读取程序文件,再读入内存加载。所以执行效率不如内置命令。但是当用户敲外置命令的时候,系统一定会开启子进程执行。

外置命令也称为:自己单独下载的文件系统命令,是处于bash shell之外的程序。一般放在:
/bin
/usr/bin
/sbin /usr/sbin

15、小结一下前面的零碎知识点:

16、shell数值计算
(1)运算符号:

  • 双小括号

(2)linux涉及到计算的命令

  • let命令
    let命令和双小括号一样,都是用于数值计算的。
    但是,双小括号效率更高,因为双小括号是嵌入linux内核中的,是shell语法层面的符号。而let是一个指令,效率肯定是弱于语法层面的。

  • expr命令


    expr命令的模式匹配功能是:当字符串匹配上了,就统计其长度,当匹配不上,就返回0。
  • bc命令
    bc命令的全称是Binary Calculator,该命令支持任意精度的运算,并且是在交互执行的情况下。



  • awk支持数值计算
    awk也支持小数计算。

    awk后面的'{}'是awk要执行的动作的标志。
    print是awk要执行的动作,动作内容最好是用小括号括住。
    小括号括住的内容是计算的内容。
  • 中括号运算
    语法是: $[表达式]

 17、read命令
read命令前面小案例中已经有用过这个命令,这个命令也是一个shell内置的命令。
-p 设置提示信息
-t 等待用户输入超时,timeout

 

  • 21
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值