截取文本某一域 shell_Shell入门体验一

正文:2879字 预计阅读时间:8min

Shell的前世今生

现在的操作系统(Windows、Mac OS、Android、iOS等)都是带图形界面的,简单直观,容易上手,可以说老少皆宜。 然而在计算机的早期发展时期却并没有图形化的界面,我们只能通过一个一个地命令来控制计算机,成堆的命令记住都非常困难,更别说熟练使用了,这个时候的计算机的使用门槛非常的高,只有专业的人员才能进行使用。 为了让计算机能够更好的普及下去,开发人员做了非常多的努力,他们发现:对于图形化的界面来说,用户点击某一个图标就能启动某个程序和使用命令行来启动程序在本质上都是类似的,都是查找程序在硬盘的安装位置,然后将他们加载到内存中运行。然而,真正能够控制计算机硬件(CPU,内存等)的只有操作系统的内核Kernel,无论是图形化的界面还是命令行都只是为了用户和内核之间建立一座沟通的桥梁。

由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核。如此一来,用户和内核之间就多了一层“代理”,这层“代理”既简化了用户的操作,也保护了内核。

用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做 Shell。

Shell的种类

6b8b1a2d993ecb9e483e59eb29f36d2e.png e2d3abb91f5bf253b0441ae8bd0f1572.png

    Linux 中提供的Shell解析器有如下几种:

03c3c089f09e2c11769aa3f5a1bf9d9f.png

bash 和 sh 的区别:

sh 的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。

sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。

sh 是第一个流行的 Shell。

bash shell 是 Linux 的默认 shell,bash 由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。bash 兼容 sh 意味着,针对 sh 编写的 Shell 代码可以不加修改地在 bash 中运行。

简单的Shell脚本

6b8b1a2d993ecb9e483e59eb29f36d2e.png e2d3abb91f5bf253b0441ae8bd0f1572.png

用Shell编写一个helloworld.sh:

d61aa58afecc6283d8cc54451bbf5813.png

b04e231bf18301b90ec2e5af6bf5f39c.png

eb64202477b27f653e4187ce1611cbdb.png

2. 多命令处理Shell脚本:

1feb986f494d7deb9ffc76a110ece38d.png

d0a578028e95891afb4a322f80f2df5b.png

Shell中的变量

6b8b1a2d993ecb9e483e59eb29f36d2e.png e2d3abb91f5bf253b0441ae8bd0f1572.png

1. 常见系统变量:

f895624350646096367c6ec98a0401fa.png

2. 自定义变量:

  • 定义变量:变量=值(=号两侧不能有空格)

  • 撤销变量:unset变量

  • 声明静态变量:readonly变量(不能撤销)

注意事项:

1. 变量名称可以用字母、数字、下划线组成,不能用数字开头。

2. 变量默认类型都是字符串类型,无法直接进行数值上的计算。

3. 变量的值中如果包含有空格,则需要使用双引号括起来。

60174bf3ee6ff12ef77d1cae8381e1c3.png

3. 常见特殊变量 :

$n: $n中的n是数字,($0代表脚本名称,$1-9代表第1-9个参数,10个参数以上需要用大括号,比如说${10})

3e9e9d13769c3ea5137706a8169f07d9.png

8afc0e8879b28be4b1784e38a7984726.png

$# :获取所有输入参数个数,常用于循环

$* :  获取命令行中所有的参数(看成一个整体)

$@:  获取命令行中所有的参数(区别对待)

f88b5626fbae99109518a70aee39d77b.png

4226c74f1fcd21e0fae98ecb168f0e87.png

$? : 获取最后一次执行的命令的返回状态(0表示正确执行,不是则未能正确执行)

cfc0e7b492261ec3836238bc24b76d6f.png

Shell中运算符

6b8b1a2d993ecb9e483e59eb29f36d2e.png e2d3abb91f5bf253b0441ae8bd0f1572.png

两种语法方式:

  1. $[运算式]

  2. expr +,  - , \*, / , % (运算符之间要有空格)

4ef35e7ff09640730be99368888ab36d.png

条件判断

6b8b1a2d993ecb9e483e59eb29f36d2e.png e2d3abb91f5bf253b0441ae8bd0f1572.png [ condition ] :  注意condition前后要有空格常见的判断条件:

1. 字符串类型 :

    = 字符串比较

    -lt  小于(less than)

    -le 小于等于 (less equal)

    -eq     等于(equal)

    -gt      大于(greater than)

    -ge     大于等于

    -ne    不等于(not equal)

2. 文件权限:

    -r/w/x 是否有读/写/执行的权限

3. 文件类型

    -f      文件是不是一个常规的文件 (file)

    -e     文件是否存在 (existence)

    -d     文件是否是一个目录(directory)

54b104435216f0e0cfa5612762514b9a.png

流程控制

6b8b1a2d993ecb9e483e59eb29f36d2e.png e2d3abb91f5bf253b0441ae8bd0f1572.png

if 语句:

if [ condition ]  代码逻辑elif [ condition ]then  代码逻辑  fi (代表结束)

51328eceebd3059c098932b509d80c1a.png

61b4f32aed25a49949117f9e3afeaf7a.png

case语句:

case $变量名 in"值1")    如果变量的值等于值1,则执行该段逻辑;;"值2")    如果变量的值等于值2,则执行该段逻辑;;"*")    如果变量的值和上面的都不相等,则执行该段逻辑;;esac

1f2af466ecac79275a13db1f4293ff92.png

788661183dc9ab0a3419ccaa1f00ded9.png

for语句:

for (( 初始值;循环控制条件;变量变化 ))   do     代码逻辑  done

df88825770fbd8e6fae8e893763c7129.png

20483b33a2e74d448c03cfd30460a016.png

for 变量 in 值1 值2 值3…   do     代码逻辑   done

f5c115cae2855d610a711649dc31d440.png

fcb272ea0bc687df504c545f23ad90c2.png

ps : $* 表示传递给脚本的所有参数

while语句:

while [ 条件判断式 ]   do     程序代码  done

65923745b461e543d47eae1c196b7671.png

c7ac7a0abc91645cbcc1bf310fe070d5.png

read 语句:(从键盘读取信息)

-t : 指定读取值时等待的时间(秒)

-p:指定读取值时的提示符;

393ad40590a750dda84ce829f9df61d5.png

f8148e8c276b32233c9ab0f49105b96f.png

函数

6b8b1a2d993ecb9e483e59eb29f36d2e.png e2d3abb91f5bf253b0441ae8bd0f1572.png

系统函数:

basename: 删除所有的前缀包括 / ,将字符串显示出来

3387f28f4ef0577c35350b316b8bcb88.png

 dirname: +文件绝对路径(从给定的包含绝对路径的文件名中取出非目录的部分),返回目录部分

8abd3df70b3c350a66838e0050059d32.png

自定义函数:

[ function ] name(){    函数逻辑}

ca5fa7803e30dfade4af60fd2c14ddcb.png

0bde615847161884b60bc2d60e1e425e.png

Shell工具(重点)

6b8b1a2d993ecb9e483e59eb29f36d2e.png e2d3abb91f5bf253b0441ae8bd0f1572.png

cut:从文件中剪切数据的工具

cut  + 选项参数 + filename选项参数:-f : 按照列号截取-d : 按照指定的分隔符截取

c555a093b821a4fd59c6bf0d2c2efb88.png

90217ef300a23407efeea516b99d4cdf.png

0af7ffed74fdc478e20ca0409b84f41a.png

b9e8096057a0d6d944042378cd8fd1e1.png

sed : 流编辑器,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

sed + 选项参数 + ‘命令参数’ + filename选项参数 : -e : 直接在指令列模式上进行sed的动作编辑命令参数:  a : 新增,a的后面可以接字符串,在下一行出现  d : 删除  s : 查找并替换

24b7b8c79ed898392eb155bb4c77ffe9.png

e9dd6ab42208f2f5712da2144f29d3de.png

awk : 一个文本分析工具,把文件逐行读入,以空格为默认分隔符将每行切片,切开的部分再进行相应的分析处理

awk + 选项参数 + ‘ 匹配模式1{命令1}  匹配模式2{命令2} ’  filename选项参数 :-F :按照指定分隔符分隔(类似于cut中的-d)

b113738f94d0699baa6a49c04a4c28ae.png

需求1 : 搜索文件找到root开头的所有行,并输出第7列

0f1efceb5384f6e9fe821140453d962e.png

需求2 : 搜索文件找到root开头的所有行,并输出第2列和第5列,用,分隔。

a4da0d88eb3a86dbec66ed0207d554c4.png

需求3 : 在第一行前面加上user,binshow。在最后一行添加"ustc, /bin/binshow",只显示第一列和第7列

d084f128cf378041a83f812c763f73ff.png

awk的内置变量:FILENAME :文件名NR :已读的记录数NF :  浏览记录的域的个数(切割后列的个数)

16cc952ecc984f712ff48b059614684f.png

be0fdac974902fb112b34f5e8c6cf1b3.png

sort : 将文件排序,并将排序结果标准化输出

sort + 选项 + 待排序的文件列表选项:-n 按照数值的大小排序-r 以相反的顺序来排序-t 设置排序时所用的分隔字符-k 指定需要排序的列

aa71ece13f35595a82f3b982ace988ea.png

22935183b83654879edf2cdf204f28e3.png

部分面试题

6b8b1a2d993ecb9e483e59eb29f36d2e.png e2d3abb91f5bf253b0441ae8bd0f1572.png
  1. 如何在脚本中使用参数 ?

  2. 如何检查之前的命令是否运行成功?

  3. 假如文件中每行第一个元素是FIND,如何获取第二个元素?

  4. 如何使用 awk 列出 UID 小于 100 的用户 ?

  5. shell 脚本如何获取输入的值 ?

1. 第一个参数 : $1,第二个参数 :$22. $?3. awk'{ if ($1 == "FIND") print$2}'4. awk -F: '$3<100' /etc/passwd5. read -p "input your num :" num

该部分学习建议 : 

知识繁杂,多敲几遍。只需要记住一些常见的命令即可,后续工作中遇到再去查阅,不需要死记硬背。适用于校招准备时间较长的同学,时间很短的话本部分内容不是重点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值