Shell笔记(超级完整)

文章目录

1.Shell 概述

Shell是一个命令行解释器,他接受应用程序/用户命令,然后调用操作系统内核
在这里插入图片描述
Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强

1.1Linux 提供的 Shell 解析器有

[root@hadoop100 ~]# cat /etc/shells

加粗样式
ubuntu使用的解析器是dash

1.2bash 和 sh 的关系

  • [root@hadoop100 ~]# ls -l /bin/ | grep bash

在这里插入图片描述

1.3Centos 默认的解析器是 bash

[root@hadoop100 ~]# echo $SHELL
在这里插入图片描述

2.Shell 脚本入门

2.1脚本格式

脚本以#!/bin/bash 开头(指定解析器)

2.2第一个 Shell 脚本:helloworld.sh

一般情况下加上.sh后缀,也可以不加.sh后缀

2.2.1需求

创建一个 Shell 脚本,输出 helloworld

2.2.2实践

先创建一个目录scripts(可以不创建,我这里为了好管理,又重新创建了一个目录),然后进入该目录,在目录里创建一个hello.sh的文件,进行编辑
[root@hadoop100 ~]# mkdir scripts
[root@hadoop100 ~]# cd scripts/
[root@hadoop100 scripts]# touch hello.sh
[root@hadoop100 scripts]# vim hello.sh
在这里插入图片描述
在hello.sh中写如下代码
#!/bin/bash
echo “hello,world”
在这里插入图片描述

2.3脚本的常用执行方式

2.3.1第一种:采用 bash 或 sh+脚本的相对路径或绝对路径(不用赋予脚本+x 权限)

2.3.1.1sh+脚本的相对路径

[root@hadoop100 scripts]# sh ./hello.sh
在这里插入图片描述

2.3.1.2sh+脚本的绝对路径

[root@hadoop100 scripts]# sh /root/scripts/hello.sh

在这里插入图片描述

2.3.1.3bash+脚本的相对路径

[root@hadoop100 scripts]# bash ./hello.sh
在这里插入图片描述

2.3.1.4bash+脚本的绝对路径

[root@hadoop100 scripts]# bash /root/scripts/hello.sh

在这里插入图片描述

2.3.2第二种:采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)

2.3.2.1首先要赋予 helloworld.sh 脚本的+x 权限

[root@hadoop100 scripts]# chmod +x hello.sh

在这里插入图片描述

2.3.2.2执行脚本
2.3.2.2.1相对路径

[root@hadoop100 scripts]# ./hello.sh

在这里插入图片描述
[root@hadoop100 scripts]# hello.sh
在这里插入图片描述
如果直接这样敲的话就会被认为是一条命令去执行

2.3.2.2.1绝对路径

[root@hadoop100 scripts]# /root/scripts/hello.sh

在这里插入图片描述

2.3.3注意

第一种执行方法,本质是 bash 解析器帮你执行脚本,所以脚本本身不需要执行 权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。

2.3.4第三种:在脚本的路径前加上“.”或者 source(了解)

2.3.4.1 source命令绝对路径

在这里插入图片描述

2.3.4.2source命令相对路径

在这里插入图片描述

2.3.4.3 “.”命令绝对路径

在这里插入图片描述

2.3.4.4 “.”命令相对路径

在这里插入图片描述

2.3.4.5注意在这里插入图片描述

这两个的区别在于第一个“.”是命令,而下面那个表示的是相对路径,因为“.”第三种情况是使脚本内容在当前 shell 里执行,所以不用加/来表示相对路径,而第一种和第二种是打开一个子 shell 来执行脚本内容,所以需要加./来表示相对路径

2.3.7子shell

在这里插入图片描述
相当于嵌套for循环,子shell的变量在父shell里面不能用,如果退出的话是先从最内层退出,然后再到最外层,相当于在在for循环里面写break,是一层一层的退出

2.3.6一般使用第二种方式执行脚本语言

2.3.6.1如果把要执行的脚本放到系统命令里(bin目录或者sbin目录)

在这里插入图片描述
但是这种情况不靠谱,因为这个目录里面是系统的命令,因此不要轻易更改

在这里插入图片描述

2.3.6.2更改环境变量

可以通过更改环境变量来直接执行脚本,可以将hello.sh放到/root/bin里面,或者直接将scripts目录放到环境变量里也可以
在这里插入图片描述

2.3.7总结

原因: 前两种方式都是在当前 shell 中打开一个子 shell 来执行脚本内容,当脚本内容结束,则 子 shell 关闭,回到父 shell 中。
第三种,也就是使用在脚本路径前加“.”或者 source 的方式,可以使脚本内容在当前 shell 里执行,而无需打开子 shell!这也是为什么我们每次要修改完/etc/profile 文件以后,需 要 source 一下的原因。
开子 shell 与不开子 shell 的区别就在于,环境变量的继承关系,如在子 shell 中设置的 当前变量,父 shell 是不可见的。

比如 更改linux中的.profile配置文件,发现没有及时生效,然后直接source 改过的文件,所有更改的环境配置文件都生效了

3.变量

3.1系统预定义变量

3.1.1常用系统变量

$HOME$PWD$SHELL$USER

在这里插入图片描述

3.1.2看所有的全局变量值

[root@hadoop100 scripts]# env
在这里插入图片描述
如果想看的方便可以加 | less

在这里插入图片描述
[root@hadoop100 scripts]# printenv
在这里插入图片描述
[root@hadoop100 scripts]# printenv USER
在这里插入图片描述
这样输入的时候不用加$符号,他可打印全部或部分shell 环境

[root@hadoop100 scripts]# set

在这里插入图片描述

看所有变量包括全局变量和自定义变量局部变量

3.2自定义变量

3.2.1基本语法

1)定义变量:变量名=变量值,注意,=号前后不能有空格
2)撤销变量:unset 变量名
3)声明静态变量:readonly 变量,注意:不能 unset

3.2.2变量定义规则

1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写
2)等号两侧不能有空格
3)在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算
4)变量的值如果有空格,需要使用双引号或单引号括起来。

3.2.3案例

3.2.3.1定义变量a

[root@hadoop100 scripts]# a=2

在这里插入图片描述

3.2.3.2查看没有定义的sssshell

[root@hadoop100 scripts]# echo $sssshell
在这里插入图片描述

3.2.3.3“=”号前后有空格的情况

在这里插入图片描述

3.2.3.4更改变量的值

在这里插入图片描述

3.2.3.5当要赋值的内容有空格的时候需要加上单引号或者双引号

在这里插入图片描述

3.2.3.6局部变量和全局变量

env只能查系统所设置的全局变量,而set可以查看所有定义的变量,到这步还不能完全知道ssshell是局部变量还是全局变量继续往下走
在这里插入图片描述
打开一个子shell
在这里插入图片描述
说明ssshell是局部变量

3.2.3.7将ssshell定义成全局变量

当我们需要在子shell里使用ssshell变量时,我们需要将ssshell定义成全局变量,定义ssshell变成全局变量的时候需要在创建ssshell的父shell变,不能在其他子shell变
在这里插入图片描述
在这里插入图片描述

3.2.3.8在子shell中更改父shell全局变量只在子shell有效,回到父shell里不会改变

在这里插入图片描述

3.2.3.9用vim输出全局变量和局部变量的区别

在这里插入图片描述
在hello.sh中加上局部变量sssshell然后执行hello.sh的结果为
在这里插入图片描述

如果用绝对路径的话是没有hello,linux这条的,因为sssshell是局部变量

把sssshell变量变为全局变量结果为
在这里插入图片描述
这两个都显示

3.2.3.10在set中看自定义变量

定义了a变量,在set里面可以找到

在这里插入图片描述

在这里插入图片描述

3.2.3.11声明静态变量

[root@hadoop100 ~]# readonly b=2
在这里插入图片描述

在这里插入图片描述
静态变量和局部变量都在set里面

3.2.3.12撤销变量a

[root@hadoop100 ~]# unset a

在这里插入图片描述

在这里插入图片描述
set里面没有a变量了

3.2.3.13不能撤销静态变量

在这里插入图片描述

3.2.3.14在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算

在这里插入图片描述

3.2.3.15如果进行数值运算需要使用,需要使用shell中的运算符的表达

[root@hadoop100 ~]# a=$((1+4))

在这里插入图片描述
[root@hadoop100 ~]# a=$[5+2]

在这里插入图片描述

3.3特殊变量

3.3.1$n

3.3.1.1基本语法
$n (功能描述:n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,
十以上的参数,十以上的参数需要用大括号包含,如${10}
3.3.1.2案例实操
3.3.1.2.1在vim里面""和’'的区别
用双引号扩住$n和用单引号扩住$n
双引号扩住$n代码变量
不管单引号扩住什么都原封不动的输出
3.3.1.2.2$n的使用

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
用绝对路径的话需要给parameter.sh加上执行权限
在这里插入图片描述

3.3.2$#

3.3.2.1基本语法
$# (功能描述:获取所有输入参数个数,
常用于循环,判断参数的个数是否正确以及 加强脚本的健壮性)。
3.3.2.2$#

在这里插入图片描述

在这里插入图片描述

3.3.3 $*、$@

3.3.3.1基本语法
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体) 
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
3.3.3.2$*$@的使用

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.3.3$?

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

在这里插入图片描述

4.运算符

4.1基本语法

$((运算式))” 或 “$[运算式]

4.1.1expr方法

用expr输出+、-、*、%
符号(+、-、*、%)两边需要空格隔开
用*的时候需要用这个\,因为*的用处很多,所以需要区分

在这里插入图片描述

4.1.2用expr给a赋值

需要使用命令替换

a=$(运算式)或者用a=`运算式`

在这里插入图片描述

4.1.3$((运算式)) 或 $[运算式]

在这里插入图片描述

4.1.4用脚本计算两个数的和

在这里插入图片描述

在add.sh中写如下代码
在这里插入图片描述

在这里插入图片描述

5.条件判断

5.1基本语法

1)test condition
2)[ condition ](注意 condition 前后要有空格)
注意:条件非空即为 true,[ atguigu ]返回 true,[ ] 返回 false。

5.2常用判断条件

5.2.1两个整数之间比较

-eq 等于(equal) -ne 不等于(not equal)
-lt 小于(less than) -le 小于等于(less equal)
-gt 大于(greater than) -ge 大于等于(greater equal)
注:如果是字符串之间的比较 ,用等号“=”判断相等;用“!=”判断不等。

5.2.2按照文件权限进行判断

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

5.2.3按照文件类型进行判断

-e 文件存在(existence)
-f 文件存在并且是一个常规的文件(file)
-d 文件存在并且是一个目录(directory)

5.2.4测试

5.2.4.1test condition

在这里插入图片描述

测试他输出的是正确还是错误使用$?来判断,输出0则表达式为真,输出1表达式为假

5.2.4.2[ condition ](注意 condition 前后要有空格)

在这里插入图片描述
用[]的时候,里面的等于号两边一定要用空格空开,否则他会识别为一个整体条件非空即为 true

在这里插入图片描述
当[]里面有东西事,则为真,只有空格时为假,如果前后不空格的话就未找到命令

5.2.4.3在[]里面使用=和!=

在这里插入图片描述

5.2.4.4-eq 等于(equal) -ne 不等于(not equal)

如果是字符串之间的比较 ,用等号“=”判断相等;用“!=”判断不等

在这里插入图片描述

5.2.4.5-lt 小于(less than) -le 小于等于(less equal)

不能用< 和<=,因为在linux里表示输入重定向
在这里插入图片描述
在双小括号里可以使用(> < >= <=号)

在这里插入图片描述

5.2.4.6-gt 大于(greater than) -ge 大于等于(greater equal)

不能用>和>=,因为在linux里>表示输出重定向
在这里插入图片描述

在双小括号里可以使用(> < >= <=号)

在这里插入图片描述

5.2.4.7判断文件权限、 -r 有读的权限(read)、 -w 有写的权限(write) 、 -x 有执行的权限(execute)

在这里插入图片描述

5.2.4.8判断文件类型、-e 文件存在(existence)、-f 文件存在并且是一个常规的文件(file)、-d 文件存在并且是一个目录(directory)

在这里插入图片描述

5.2.4.9多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一 条命令执行失败后,才执行下一条命令)

在这里插入图片描述

6.流程控制(重点)

6.1if 判断

6.1.1基本语法

注意事项:
①[ 条件判断式 ],中括号和条件判断式之间必须有空格
②if 后要有空格

6.1.1.1单分支
if [ 条件判断式 ];then
 程序 
fi
或者 
if [ 条件判断式 ] 
then
 程序 
fi
6.1.1.2多分支
if [ 条件判断式 ] 
then
	程序 
elif [ 条件判断式 ] 
then
	程序 
else
	程序 
fi

6.1.2案例

6.1.2.1单分支

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
当这样写的时候,没有传入参数时,会报错的,所以要按照下面的做法做

在这里插入图片描述

在这里插入图片描述
这样的话就不会报错了,因为要是不输入参数的时候两边也都不会为空

6.1.2.2用逻辑与&&逻辑或||连接(单分支)
6.1.2.2.1逻辑与&&

在这里插入图片描述

在中括号里面的话就不用&&而是用-a(-and)

在这里插入图片描述

6.1.2.2.2逻辑或||

在这里插入图片描述

在中括号里面的话就不用||而是用-o(-or)
在这里插入图片描述

6.1.2.3多分支

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

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

6.2case 语句

6.2.1基本语法

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

6.2.2注意事项:

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

6.2.3案例cast_test.sh

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6.3for 循环

6.3.1基本语法1

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

6.3.2基本语法 2

for 变量 in123do 
	程序 
done

6.3.3案例

6.3.3.1for (( 初始值;循环控制条件;变量变化 ))

在这里插入图片描述

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

6.3.3.2“{}”在linux shell里面表示生成序列

在这里插入图片描述

{1…100}表示从1到100,中间是两个点,别看错了

6.3.3.3for 变量 in 值 1 值 2 值 3…

在这里插入图片描述

6.3.3.2在for循环中$*和$@的区别

在这里插入图片描述
$*和$@没有加双引号的时候输出结果为下:

在这里插入图片描述
他们两个的输出结果一致

在这里插入图片描述

当加上双引号后。结果如下:
在这里插入图片描述

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

6.4while 循环

6.4.1基本语法

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

6.4.2从1加到100

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6.4.3let用法

在新版shell中支持用let的,他的语言是和高级语言差不多的
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

7.read 读取控制台输入

read 是 Shell 内置命令,用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据。

7.1基本语法

read (options) (variables)

options表示选项,如下表所示;
variables表示用来存储数据的变量,可以有一个,也可以有多个。
options和variables都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 REPLY 中。
①options:

  • -p:指定读取值时的提示符;
  • -t:指定读取值时等待的时间(秒)如果-t 不加表示一直等待

②variables

  • 变量:指定读取值的变量名

7.2read的使用

在这里插入图片描述

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

如果超过设置的时间,则直接跳过
在这里插入图片描述

8.函数

8.1系统函数

8.1.1basename

8.1.1.1基本语法

basename [string / pathname] [suffix] (功能描述:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
basename 可以理解为取路径里的文件名称
选项:
suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。

8.1.2dirname

dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
dirname 可以理解为取文件路径的绝对路径名称

8.1.3案例

8.1.3.1date+%s时间戳练习

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

8.1.3.2basename的练习

在这里插入图片描述

将文件名剪切下来
在这里插入图片描述
parameter文件的代码
在这里插入图片描述

显示的文件名包括路径,我们不需要输出路径,因此加上basename来解决

在这里插入图片描述

在这里插入图片描述

8.1.3.3dirname的练习

dirname截取最后一个斜杠之前的路径,不包括文件名
而basename截取最后一个斜杠之后的文件名,不包括路径

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

如果只有pwd的话,在其他文件夹里执行代码则不会打印脚本的目录,需要加上dirname,如下
在这里插入图片描述

在这里插入图片描述

加上dirname后输出的脚本路径是保持不变的

8.2自定义函数

8.2.1基本语法

[ function ] funname[()] 
{ 
	Action; 
	[return int;] 
}

8.2.2经验技巧

(1)必须在调用函数地方之前,先声明函数,shell 脚本是逐行运行。不会像其它语言一样先编译。
(2)函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return 后跟数值 n(0-255)

8.2.3案例

8.2.3.1没有使用return的版本

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
可以输出和

8.2.3.2用return返回的话

在这里插入图片描述
在这里插入图片描述
可以看出,return后面必须是跟数字,修改如下:
在这里插入图片描述
在这里插入图片描述

这样就可以正常输出结果了,但是return的时候只能返回0-255,超过的数就不能显示正确的答案,如下
在这里插入图片描述
156+245!=145的,所以可以说明return只能返回0-255的数,那我们应该如何解决呢,看下面的代码
在这里插入图片描述
这样写就可以将函数add里面echo的值赋给ans,然后再输出
在这里插入图片描述

结果也是对的,说明这样写是正确的

9.正则表达式入门

正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在 Linux 中,grep,sed,awk 等文本处理工具都支持通过正则表达式进行模式匹配。

9.1常规匹配

一串不包含特殊字符的正则表达式匹配它自己,例如:
在这里插入图片描述
[root@hadoop100 ~]# cat /etc/passwd | grep 00:
就会匹配所有包含 00:的行。

9.2常用特殊字符

9.2.1特殊字符:^

^ 匹配一行的开头,例如:
在这里插入图片描述
会匹配出所有以 a 开头的行

9.2.2特殊字符:$

$ 匹配一行的结束,例如
在这里插入图片描述

会匹配出所有以 h结尾的行

  • 思考:^$ 匹配什么?

匹配空行

在这里插入图片描述
daily_archive.sh文件是在http://t.csdn.cn/0Wpml 写的,想看的点这里看里面的内容

9.2.3特殊字符:.

匹配一个任意的字符,例如
在这里插入图片描述

9.2.4特殊字符:*

“*”不单独使用,他和上一个字符连用,表示匹配上一个字符 0 次或多次,例如

[root@hadoop100 ~]# cat /etc/passwd | grep ro*t
在这里插入图片描述

会匹配 rt, rot, root, rooot, roooot 等所有行

思考:.* 匹配什么?
匹配任意字符,可以和^$连用,放在他们中间用,就可以将下面的代码实现,以a开头,login结尾的行
在这里插入图片描述

[root@hadoop100 ~]# cat /etc/passwd | grep ^a.*login$

在这里插入图片描述
[root@hadoop100 ~]# cat /etc/passwd | grep ^a.*var.*login$

9.2.5字符区间(中括号):[ ]

[ ] 表示匹配某个范围内的一个字符,例如
[6,8]------匹配 6 或者 8
[0-9]------匹配一个 0-9 的数字
[0-9]------匹配任意长度的数字字符串
[a-z]------匹配一个 a-z 之间的字符
[a-z]
------匹配任意长度的字母字符串
[a-c, e-f]-匹配 a-c 或者 e-f 之间的任意字符

在这里插入图片描述
[root@hadoop100 ~]# cat /etc/passwd | grep r[a-z]*t

9.2.6特殊字符:\

\ 表示转义,并不会单独使用。由于所有特殊字符都有其特定匹配模式,当我们想匹配某一特殊字符本身时(例如,我想找出所有包含 ‘$’ 的行),就会碰到困难。此时我们就要将转义字符和特殊字符连用,来表示特殊字符本身,例如

在这里插入图片描述

就会匹配所有包含 $ 的行。注意需要使用单引号将表达式引起来。

9.2.7匹配手机号

在这里插入图片描述

[root@hadoop100 scripts]# echo “13812345678” | grep ^1[34578][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$

在这里插入图片描述

[root@hadoop100 scripts]# echo “13812345678” | grep -E ^1[34578][0-9]{9}$

记得加大写的-E,因为目前grep不支持{9}的扩展的正则的,所以需要加上-E,表示支持扩展的正则表达式

10.文本处理工具

10.1cut

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

10.1.1基本用法

cut [选项参数] filename
说明:默认分隔符是制表符

10.1.2选项参数说明

选项参数功能
-f列号,提取第几列
-d分隔符,按照指定分隔符分割列,默认是制表符“\t”
-c按字符进行切割 后加加 n 表示取第几列 比如 -c 1

10.1.3案例

10.1.3.1数据准备

[root@hadoop100 scripts]# vim cut_test.txt
在这里插入图片描述

10.1.3.2切割 cut_test.txt 第一列

[root@hadoop100 scripts]# cut -d " " -f 1 cut_test.txt
在这里插入图片描述

10.1.3.3切割 cut_test.txt 第二、三列

[root@hadoop100 scripts]# cut -d " " -f 2,3 cut_test.txt
在这里插入图片描述

10.1.3.4在 cut_test.txt 文件中切割出 nan

[root@hadoop100 scripts]# cat cut_test.txt | grep nan | cut -d " " -f 1

在这里插入图片描述

10.1.3.5要passwd中以bash结尾的第一,六,七列

[root@hadoop100 scripts]# cat /etc/passwd | grep bash$ | cut -d “:” -f 1,6,7

在这里插入图片描述

如果列多的话总不能1,2,3,4,5,6,7,8,9,10…等吧,可以用“-”来,下面介绍

10.1.3.6要passwd中以bash结尾的第1-4列

[root@hadoop100 scripts]# cat /etc/passwd | grep bash$ | cut -d “:” -f 1-4

在这里插入图片描述

10.1.3.7要passwd中以bash结尾的第4列往后的全部列

[root@hadoop100 scripts]# cat /etc/passwd | grep bash$ | cut -d “:” -f 4-

在这里插入图片描述

10.1.3.8要passwd中以bash结尾的第4列之前的全部列

[root@hadoop100 scripts]# cat /etc/passwd | grep bash$ | cut -d “:” -f -4

在这里插入图片描述

10.1.3.9选取系统 PATH 变量值,第 2 个“:”开始后的所有路径:

[root@hadoop100 scripts]# echo $PATH | cut -d “:” -f 3-

在这里插入图片描述

10.1.3.10切割 ifconfig 后打印的 IP 地址

[root@hadoop100 scripts]# ifconfig ens33 | grep netmask | cut -d " " -f 10

为什么是10呢,因为inet前面有8个空格
在这里插入图片描述

10.2awk

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

10.2.1基本用法

awk [选项参数] ‘/pattern1/{action1} /pattern2/{action2}…’ filename
pattern:表示 awk 在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令

10.2.2选项参数说明

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

10.2.3案例

10.2.3.1搜索 passwd 文件以 root 关键字开头的所有行,并输出该行的第 7 列

在这里插入图片描述

10.2.3.2搜索 passwd 文件以 root 关键字开头的所有行,并输出该行的第 1 列和第 7 列, 中间以“,”号分割

用cut是不能改变输出中间用什么隔开的,而awk可以,记住,需要用“”包裹
在这里插入图片描述

10.2.3.3只显示/etc/passwd 的第一列和第七列,以逗号分割,且在所有行前面添加列名 user,shell 在最后一行添加"end of file"

[root@hadoop100 scripts]# cat /etc/passwd | awk -F “:” ‘BEGIN{print “user,shell”}{print $1","$7} END{print “end of file”}’

在这里插入图片描述

在这里插入图片描述

10.2.3.4将 passwd 文件中的用户 id 增加数值 1 并输出

在这里插入图片描述

在这里插入图片描述

因为{}里面是代码块,可以直接在里面更改

在这里插入图片描述

如果{}代码块里的代码多了,需要更改会很麻烦,因此使用-v,这样的话在外面一改数字代码块里面的代码就都改了

10.2.4awk 的内置变量

变量说明
FILENAME文件名
NR已读的记录数(行号)
NF浏览记录的域的个数(切割后,列的个数)
10.2.4.1统计 passwd 文件名,每行的行号,每行的列数

[root@hadoop100 scripts]# awk -v i=1 -F “:” ‘{print “文件名:” FILENAME “行号:” NR “列数:” NF}’ /etc/passwd

在这里插入图片描述

10.2.4.2查询 ifconfig 命令输出结果中的空行所在的行号

[root@hadoop100 scripts]# ifconfig | grep -n ^$

在这里插入图片描述
用之前的方法输出会有":",但是结果不想要,用awk解决

[root@hadoop100 scripts]# ifconfig | awk ‘/^$/ {print NR}’

在这里插入图片描述

也可以随意加东西

[root@hadoop100 scripts]# ifconfig | awk ‘/^$/ {print "空行:"NR}’

在这里插入图片描述

10.2.4.3切割 IP

使用cut时-f后需要数前面那一堆空格

在这里插入图片描述

使用awk后,前面那一堆空格是不需要数的
在这里插入图片描述

11.归档文件

实际生产应用中,往往需要对重要数据进行归档备份。
需求:实现一个每天对指定目录归档备份的脚本,输入一个目录名称(末尾不带/),将目录下所有文件按天归档保存,并将归档日期附加在归档文件名上,放在/root/archive下。
这里用到了归档命令: tar
后面可以加上-c选项表示归档,加上-z选项表示同时进行压缩,得到的文件后缀名为.tar.gz

11.1脚本实现

在这里插入图片描述

#!/bin/bash

#首先判断输入参数个数是否为1
if [ $# -ne 1 ]
then
        echo "参数个数错误!应该输入一个参数,作为归档目录名"
        exit
fi

# 从参数中获取目录名称
if [ -d $1 ]
then
        echo
else
        echo
        echo "目录不存在!"
        echo
        exit
fi

DIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1); pwd)

# 获取当前日期
FILE=archive_${DIR_NAME}_$DATE.tar.gz
DEST=/root/archive/$FILE

# 开始归档目录文件

echo "开始归档..."
echo

tar -czf $DEST $DIR_PATH/$DIR_NAME

if [ $? -eq 0 ]
then
        echo
        echo "归档成功!"
        echo "归档文件为:$DEST"
        echo
else
        echo "归档出现问题!"
        echo
fi

exit

11.2测试

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
则创建一个文件
在这里插入图片描述

在这里插入图片描述

归档成功

11.3定期归档

使用crontab
crontab中的代码

0 2 * * * /root/scripts/daily_archive.sh /root/scripts

在这里插入图片描述

12.发送消息

在这里插入图片描述

这个可以查看用户在线情况, +号代表的是可以发送信息,mesg是打开的
在这里插入图片描述
mesg n可以将mesg关闭
mesg y可以将mesg打开

12.1write发送信息

  • write 用户名 控制台
    [root@hadoop100 scripts]# write cat pts/1

在这里插入图片描述

在这里插入图片描述

我们可以利用 Linux 自带的 mesg 和 write 工具,向其它用户发送消息。
需求:实现一个向某个用户快速发送消息的脚本,输入用户名作为第一个参数,后面直接跟要发送的消息。脚本需要检测用户是否登录在系统中、是否打开消息功能,以及当前发送消息是否为空。
脚本实现如下:

#!/bin/bash

# 查看用户是否登录
login_user=$(who | grep -i -m 1 $1 | awk '{print $1}')

if [ -z $login_user ]
then
        echo "$1 不在线!"
        echo "脚本退出..."
        exit
fi

# 查看用户是否开启消息功能
is_allwoed=$(who -T | grep -i -m 1 $1 | awk '{print $2}')


if [ "$is_allowed"x != "+"x ]
then
        echo "$1 没有开启消息功能"
        echo "脚本退出..."
        exit
fi

# 确认是否有消息发送
if [ -z $2 ]
then
        echo "$1 没有消息发送"
        echo "脚本退出..."
        exit
fi

# 从参数中获取要发送的消息
whole_msg=$(echo $* | cut -d " " -f 2-)

# 获取用户登录的终端
user_terminal=$(who | grep -i -m 1 $1 | awk '{print $2}')

# 写入要发送的消息
echo $whole_msg | write $login_user $user_terminal

if [ $? != 0 ]
then
        echo "发送失败!"
else
        echo "发送成功!"
fi
exit

在这里插入图片描述

在这里插入图片描述

完结!!!

  • 18
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
linux shell编程 教程大全 目 录 译者序 前言 第一部分 shell 第1章 文件安全与权限 1 1.1 文件 1 1.2 文件类型 2 1.3 权限 2 1.4 改变权限位 4 1.4.1 符号模式 4 1.4.2 chmod命令举例 5 1.4.3 绝对模式 5 1.4.4 chmod命令的其他例子 6 1.4.5 可以选择使用符号模式或绝对模式 7 1.5 目录 7 1.6 suid/guid 7 1.6.1 为什么要使用suid/guid 8 1.6.2 设置suid/guid的例子 8 1.7 chown和chgrp 9 1.7.1 chown举例 9 1.7.2 chgrp举例 9 1.7.3 找出你所属于的用户组 9 1.7.4 找出其他用户所属于的组 10 1.8 umask 10 1.8.1 如何计算umask值 10 1.8.2 常用的umask值 11 1.9 符号链接 12 1.9.1 使用软链接来保存文件的多个映像 12 1.9.2 符号链接举例 12 1.10 小结 13 第2章 使用find和xargs 14 2.1 find命令选项 14 2.1.1 使用name选项 15 2.1.2 使用perm选项 16 2.1.3 忽略某个目录 16 2.1.4 使用user和nouser选项 16 2.1.5 使用group和nogroup选项 16 2.1.6 按照更改时间查找文件 17 2.1.7 查找比某个文件新或旧的文件 17 2.1.8 使用type选项 17 2.1.9 使用size选项 18 2.1.10 使用depth选项 18 2.1.11 使用mount选项 18 2.1.12 使用cpio选项 18 2.1.13 使用exec或ok来执行shell命令 19 2.1.14 find命令的例子 20 2.2 xargs 20 2.3 小结 21 第3章 后台执行命令 22 3.1 cron和crontab 22 3.1.1 crontab的域 22 3.1.2 crontab条目举例 23 3.1.3 crontab命令选项 23 3.1.4 创建一个新的crontab文件 24 3.1.5 列出crontab文件 24 3.1.6 编辑crontab文件 24 3.1.7 删除crontab文件 25 3.1.8 恢复丢失的crontab文件 25 3.2 at命令 25 3.2.1 使用at命令提交命令或脚本 26 3.2.2 列出所提交的作业 27 3.2.3 清除一个作业 27 3.3 &命令 27 3.3.1 向后台提交命令 28 3.3.2 用ps命令查看进程 28 3.3.3 杀死后台进程 28 3.4 nohup命令 29 3.4.1 使用nohup命令提交作业 29 3.4.2 一次提交几个作业 29 3.5 小结 30 第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 shell输入与输出 34 5.1 echo 34 5.2 read 35 5.3 cat 37 5.4 管道 38 5.5 tee 39 5.6 标准输入、输出和错误 40 5.6.1 标准输入 40 5.6.2 标准输出 40 5.6.3 标准错误 40 5.7 文件重定向 40 5.7.1 重定向标准输出 41 5.7.2 重定向标准输入 42 5.7.3 重定向标准错误 42 5.8 结合使用标准输出和标准错误 43 5.9 合并标准输出和标准错误 43 5.10 exec 44 5.11 使用文件描述符 44 5.12 小结 45 第6章 命令执行顺序 46 6.1 使用&& 46 6.2 使用|| 46 6.3 用()和{ }将命令结合在一起 47 6.4 小结 48 第二部分 文本过滤 第7章 正则表达式介绍 49 7.1 使用句点匹配单字符 50 7.2 在行首以^匹配字符串或字符序列 50 7.3 在行尾以$匹配字符串或字符 51 7.4 使用*匹配字符串中的单字符或其重复 序列 51 7.5 使用\屏蔽一个特殊字符的含义 52 7.6 使用[]匹配一个范围或集合

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Redamancy_06

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值