Shell编程

Shell概述

Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。
在这里插入图片描述
Linux系统的核心是内核(Kernal)。内核控制着计算机系统上的所有硬件和软件,在必要时为应用程序分配硬件, 并根据需要执行程序中的代码。
内核主要负责以下四种功能:

  • 系统内存管理
  • 软件程序管理
  • 硬件设备管理
  • 文件系统管理

简单来说Shell是一种特殊的交互式工具,核心是命令提示符,允许输入文本命令,解释命令,并在内核中执行命令。

Shell解析器

Linux提供的Shell解析器有:

[jachin@hadoop100 ~]$ cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin #仅不能执行登录功能
/bin/dash
/bin/tcsh
/bin/csh

不同的shell解析器,功能不同,比如csh,符合c语言风格的shell解析器。Centos默认使用的是/bin/sh 和 /bin/bash作为shell解析器
(2)bash和sh的关系

[jachin@hadoop100 bin]$ ll | grep bash
-rwxr-xr-x. 1 root root 941880 511 2016 bash
lrwxrwxrwx. 1 root root      4 527 2017 sh -> bash

(3)Centos默认的解析器是bash

[jachin@hadoop100 bin]$ echo $SHELL
/bin/bash

脚本的执行

①声明: 脚本以 #!/bin/bash 开头(指定解析器)
②正文: 必须是shell解释器能否解释的命令

脚本的执行方式

  • ① bash /sh + 脚本
    特点: 新开一个bash执行脚本,一旦脚本执行完毕,bash自动关闭!
  • ② ./脚本,前提是当前用户对脚本有执行权限,使用当前默认的解释器执行脚本
    特点: 新开一个bash执行脚本,一旦脚本执行完毕,bash自动关闭!
  • ③ source / . +脚本 使用当前默认的解释器执行脚本,并不要求当前用户对脚本有执行权限
    特点: 在当前bash执行脚本

Shell中的变量

常用系统变量

	$HOME、$PWD、$SHELL、$USER等

查看系统变量的值

[jachin@hadoop100 datas]$ echo $HOME

显示当前Shell中所有变量:set

[jachin@hadoop100 datas]$ set
BASH=/bin/bash
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()

自定义变量

1.基本语法
(1)定义变量:变量=值
(2)撤销变量:unset 变量名
(3)声明静态变量:readonly变量,注意:不能unset

readonly : 用来修饰一个只读(不能修改,删除)变量!
export:    导出!将一个变量提升为全局变量!

局部变量: 默认变量只在定义变量的bash中有效!
如果希望在bash-a访问bash-b中定义的变量!
	要求: ①bash-b不能关闭
	      ②让bash-b将变量提升为全局变量,才能访问到!

2.变量定义规则
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写
(2)等号两侧不能有空格
(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
(4)变量的值如果有空格,需要使用双引号或单引号括起来。
(5)使用双引号,可以识别空格之外的其他变量,使用单引号则会只会忽略空格!
(6)使用反引号,可以将语句运行的结果作为值赋值给变量! 命令` 等价于 $(命令)

变量的生命周期:

	在第一次新增时产生
	变量在执行unset时,撤销,失效!
	关闭当前bash,所有定义的变量也不会存在!

特殊的变量

$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

$n (功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})

$# (功能描述:获取所有输入参数个数,常用于循环)。

$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)

$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)

比较 $* 和 $@ 区别

(a) ∗ 和 *和 @都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 2 … 2 … 2n的形式输出所有参数。

(b)当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 2 … 2 … 2n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “ 2 ” … ” 2”…” 2n”的形式输出所有参数。

在这里插入图片描述
在这里插入图片描述

运算符

(1)$((运算式)) 或 $[运算式]
(2)expr + , - , \*, /, % 加,减,乘,除,取余
注意:expr运算符间要有空格;

* 号需要转义为 \*,否则会被视为通配符;
运算指的都是整数的运算,浮点运算需要借助其他的命令!

举例:
计算 (1 + 1) * 2 - 3

expr `expr 1 + 1` \* 2 - 3

计算 ((1 + 1) * 2 - 3)* 2

expr $(expr `expr 1 + 1` \* 2 - 3) \* 2

条件判断

基本语法
[ condition ](注意condition前后要有空格)

注意:条件非空即为true(返回0),[ abc ]返回true,[] 返回false(返回1)。

常用判断条件
(1)两个整数之间比较

= 字符串比较
-lt 小于(less than)			
-le 小于等于(less equal)
-eq 等于(equal)				
-gt 大于(greater than)
-ge 大于等于(greater equal)	
-ne 不等于(Not equal)

(2)按照文件权限进行判断

-r 有读的权限(read)			
-w 有写的权限(write)
-x 有执行的权限(execute)

(3)按照文件类型进行判断

-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence)		
-d 文件存在并是一个目录(directory)
-s 文件存在且不为空          
-L 文件存在且是一个链接(link)

流程控制

if 判断

if [ 条件判断式 ] 
  then 
	程序 
	elif 条件判断式
		then 程序..
	else 程序..
fi

或

if [ 条件判断式 ] ; then 
	程序.. 
elif [条件判断式] ; then 
	程序..
else 程序
fi

注意事项:
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格
在这里插入图片描述

case 语句

1.基本语法

case $变量名 in 
  "值1") 
    如果变量的值等于值1,则执行程序1 
    ;; 
  "值2") 
    如果变量的值等于值2,则执行程序2 
    ;; 
  …省略其他分支… 
  *) 
    如果变量的值都不是以上的值,则执行此程序 
    ;; 
esac

注意事项:

  1. case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
  2. 双分号“;;”表示命令序列结束,相当于java中的break。
  3. 最后的“*)”表示默认模式,相当于java中的default。

在这里插入图片描述

for 循环

1.基本语法1

for (( 初始值;循环控制条件;变量变化 )) 
  do 
    程序 
  done
或
for (( 初始值;循环控制条件;变量变化 )); do 程序; done

在这里插入图片描述
foreach循环

for 变量 in 值1 值2 值3… 
  do 
    程序 
  done
或
for 变量 in 1 2 3; do 程序; done
或
for 变量 in {1..3}; do 程序; done

在这里插入图片描述
while循环

while [ 条件判断式 ] 
do 
    程序
done
或
while((表达式))
do
	程序
done

在这里插入图片描述

read读取控制台输入

基本语法

read(选项)(参数)

选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)。
参数
变量:指定读取值的变量名
在这里插入图片描述

系统函数

dirname基本语法

dirname 文件绝对路径		

(功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
在这里插入图片描述

basename基本语法

basename [string / pathname] [suffix]  	

(功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
选项:
suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
在这里插入图片描述

自定义函数

在这里插入图片描述
在这里插入图片描述

Shell工具

wc

wc [选项参数] filename
选项参数功能
-l统计文件行数
-w统计文件的单词数
-m统计文件的字符数
-c统计文件的字节数

cut

cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。

1.基本用法

cut [选项参数]  filename 

说明:默认分隔符是制表符

选项参数功能
-ff为fileds,列号,提取第几列
-dd为Descriptor分隔符,按照指定分隔符分割列

在这里插入图片描述
切割ifconfig 后打印的IP地址
在这里插入图片描述

sed

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

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

在这里插入图片描述
在这里插入图片描述

sort

sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。默认情况以第一个字符串的字典顺序来排序!

sort(选项)(参数)
选项说明
-n依照数值的大小排序
-r以相反的顺序来排序
-t设置排序时所用的分隔字符,默认使用TAB
-k指定需要排序的列
-uu为unique的缩写,即如果出现相同的数据,只出现一行

参数:指定待排序的文件列表
在这里插入图片描述

awk

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

awk [选项参数] ‘pattern1{action1}  pattern2{action2}...’ filename

pattern:表示AWK在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令

选项参数功能
-F指定输入文件折分隔符
-v赋值一个用户定义变量

在这里插入图片描述
awk的内置变量(关键字)

变量说明
print向屏幕输出内容
$1-$n第n列
BEGIN代表开始读取文件内容之前,做什么事,初始化代码块
END代表开始读取文件内容之后,做什么事,结束代码块
FILENAME文件名
NR已读的记录数(行号)
NF浏览记录的域的个数(切割后列的个数)

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值