Linux基础:Shell 编程和Shell脚本(20210720笔记)

Linux基础:Shell 编程和Shell脚本(20210720笔记)

  • Shell 编程和Shell脚本
    • 需要掌握
    • 1、理解Shell功能作用——shell:命令的解释器(命令行)
    • 2、第一个脚本:输出hello world
    • 3、变量
      • 环境变量
      • 预定义变量
      • 自定义变量
      • 引号的作用
      • 更改shell环境
    • 4、流程控制
      • 分支
      • 循环
      • 数值判断
      • 返回值
      • 非技术问题
      • 练习:循环创建用户
    • 5、shell其他注意事项
    • 6、正则表达式
      • 管道符 | 和 grep egrp
      • 正则表达式(基本grep 扩展egrep)
        • grep命令
        • 规则语法
  • 练习:有实际意义的脚本
    • 完整版的批量创建用户
    • 简化版服务器巡检:自动检测磁盘空间剩余

Shell 编程和Shell脚本

需要掌握

1、理解Shell功能作用

2、编写第一个shell脚本:输出hello world

3、变量

4、流程控制(分支、循环)

5、shell其他注意事项

6、正则表达式

1、理解Shell功能作用——shell:命令的解释器(命令行)

Unix最常见的shell:bash shell

Windows的shell:cmd powershell

shell脚本的作用:把命令写在可执行文件中,执行文件相当于执行命令,并且可以在其中添加分支、循环等高级功能

shell脚本必须为可执行文件,如果在PATH路径中,可以直接使用文件名进行调用。

which <命令> #查看命令的文件路径 

2、第一个脚本:输出hello world

在屏幕上输出hello world

echo “hello world”【用引号引起来,是一个整体】

写入一个可执行文件(通常文件以sh结尾【xxx.sh】)

新建一个1.sh,写入以下内容

#!/bin/bash #用bash shell语法运行
echo 'hello world'

#!符号能够被内核识别为一个脚本的开始,这一行必须位于脚本的首行,/bin/bash 是bash程序的绝对路径,在这里表示后续的内容将通过bash程序解释执行。

执行shell脚本(先加权限)

chomd +x 1.sh

sh 1.sh #不需要执行权限bash 1.sh #不需要执行权限

或 ./1.sh 

或 <绝对路径/相对路径> 1.sh #需要执行权限source 1.sh

或 . 1.sh

3、变量

使用 env 命令可以查看环境变量,使用 set 命令可以查看局部变量。

变量不需要提前声明

$变量名 ——取变量的值

环境变量

定义系统的相关配置项,例如默认的文本编辑器

系统的相关配置项 export查看

echo $hostname
echo $shell
export

预定义变量

$1  #第一个变量 

$2  #第二个变量

ls -a -l #-a是第一个,-l是第二个

$?  #上一个命令的返回值(【一般】正确0错误非0)

$n   #n为数字,10以上要加{}(${10}),第n个命令

$*  #命令行中所有参数 

$@  #所有参数,但把每个参数区分对待

$#  命令行中所有参数的个数

Linux基础:Shell 编程和Shell脚本(20210720笔记)_第1张图片

自定义变量

pie=3.14  命名空间(作用范围)是进程内部(当前窗口、用户的shell)
echo $pie

在这里插入图片描述

引号的作用

“双引号”:引号内的变量会生效

‘单引号’:引号内的变量不会生效

`后/反引号` :引号内的命令会生效【等价于$()】

\:转义符,后面第一个字符没有任何特殊含义

echo "$hostname"
echo '$hostname'
echo `pwd`
echo "\$hostname"

命令本身也是文件

which <命令> 查看命令的文件路径

更改shell环境

a) 定义 shell 变量(局部变量)

A=a #定义变量 A 的值为 a 

B=b #定义变量 B 的值为 b 

A_B=123 #定义变量 A_B 的值为 123 

echo $A #使用美元符号“$”表示变量 

echo $A_B #正确用法:echo ${A_B} 使用大括号括起变量,$()表示新执行括号中的命令,不能用于表示变量的范围

unset A #注销变量A

readonly A=a  #声明静态变量A,不能注销(unset)

定义规则

变量名称可以由字母、数字和下划线组成,但不能数字开头

等号两侧不能由空格

变量名称一般习惯为大写

b) 设置环境变量

通过前面的例子介绍A=a 只是定义了一个局部变量,只会在本 shell 中生效,如果要在其他 shell 中生效的话,例如子 shell,就需要导出为环境变量。(环境变量在其他的窗 口下也无法生效)使用 export 命令实现导出。

为了让/etc/profile的环境变量生效,需要使用source /etc/profile重启系统或者注销用户

使用自定义的环境变量:

A_HOME=/地址

echo "a_home=$A_HOME"

c) 自动设置变量

当 Bash 启动的时候,会加载变量的配置文件来初始化 shell 环境。因此,通过配置变量的配置文件,可以设置变量重启后依然生效,设置在所有的会话和 shell 中都生效。

/etc/profile(系统全局变量和登录系统的一些配置)

~/.bash_profile(用户自定义配置)

~/.bashrc(影响所有的交互式 shell 用户的配置)

/etc/bashrc(全局自定义配置) Bash 按以上顺序运行配置文件,后运行覆盖前运行文件的同名变量。

d) 取消设置变量

export -n <变量> #将变量从环境变量变回局部变量 

unset <变量> #取消变量设置 

注意:

  1. export 命令将环境变量变回局部变量,局部变量仍能在当前 shell 中生效
  2. unset 命令不修改配置文件中的内容,所以运行后,在当前 shell 变量被取消,一旦 重新加载配置文件,那么变量会重新生效。

4、流程控制

分支

if语句

if [ 条件1 ];then 
	xxxxx
elif [ 条件2 ];then 
	xxxx
	......
else
	xxxxx
fi
写一个脚本,判断用户的输入是yes or no
if[ 输入 = yes ];then
	echo "your input is right"
elif[ 输入 = no ];then
	echo "no"
else
	echo "error"
fi

Linux基础:Shell 编程和Shell脚本(20210720笔记)_第2张图片

case语句

case 变量的值 in
值1)
	xxxx
	;;
值2)
	xxxx
	;;
*)
	xxxx
	;;
esac

Linux基础:Shell 编程和Shell脚本(20210720笔记)_第3张图片

输入的处理:Linux自带了一个函数read,默认从键盘读取输入,如果不指定变量,默认赋值给一个变量REPLY
在这里插入图片描述

循环

for循环

for 变量 in 变量的值
do
	xxxx
done

Linux基础:Shell 编程和Shell脚本(20210720笔记)_第4张图片

【自动统计当前目录下文件数量】

思路:1、找出所有文件;2、设置一个计数器,找到一个文件就加一;3、最后一个文件,后面没有就结束,返回计数器的值

Linux基础:Shell 编程和Shell脚本(20210720笔记)_第5张图片

【统计其他文件夹下的文件数】

方法1:去到对应目录,执行该脚本,不需要将脚本复制过去(脚本在哪不重要,重要的是在哪里执行)
在这里插入图片描述

方法2:将路径指定为预定义变量(加个$1)

Linux基础:Shell 编程和Shell脚本(20210720笔记)_第6张图片

for (( i=0; i<10; i++))
do
	xxxx
done

i=0 循环开始时,变量的值是0

i++ 每循环一次,i在原来基础上+1

i<10 直到不满足i<10条件终止循环

Linux基础:Shell 编程和Shell脚本(20210720笔记)_第7张图片

while结构

while [ 条件 ]
do
	xxxx
done

当条件为真,就执行下面内容
Linux基础:Shell 编程和Shell脚本(20210720笔记)_第8张图片

【写一个脚本计算1+2+…+100】

计数器sum,初始值0

变量i,初始值1,每次循环后自动+1

每次循环,都把i的值加到sum上

循环100次(只有i<101时才继续)
Linux基础:Shell 编程和Shell脚本(20210720笔记)_第9张图片

数值判断

Linux基础:Shell 编程和Shell脚本(20210720笔记)_第10张图片

返回值

Linux基础:Shell 编程和Shell脚本(20210720笔记)_第11张图片

脚本在处理过程中,可以通过exit命令来退出。

同时,会结合0-255的整数参数来表示退出代码。

0表示执行正常,非零值表示执行错误 ,$?查看(只保留一个退出代码的值)

非技术问题

拿到脚本后先看环境(脚本在不同环境不能混用)

Linux中,文件名区分大小写

练习:循环创建用户

Linux基础:Shell 编程和Shell脚本(20210720笔记)_第12张图片

5、shell其他注意事项

常见错误

漏空格/多空格(=前后无空格)

语句结构(if,else,then,fi/case,in,;;,esac/while,do,done/for,do,done)

有无引号、括号()、大括号{}

对变量的取值符号$

对齐(tab缩进)

6、正则表达式

公式匹配有一定规律的字符串

一种模式匹配语言,可使应用筛选数据以查找特定的内容

管道符 | 和 grep egrp

**管道符 | **

用法: 命令1 | 命令2

效果:命令1的输出作为命令2的输入

筛选grep

效果:根据指定的关键字(或表达式)筛选符合条件的内容(以行为单位)
在这里插入图片描述

正则表达式(基本grep 扩展egrep)

grep命令

全面搜索正则表达式并把行打印出来

grep [选项] <内容> <文件> 

-v:表示反选,即筛选不带有匹配项的内容

-i:表示不区分大小写,默认区分大小写

-A/B <数字>:显示匹配项之后/之前的多少行

-e:提供逻辑项

【例1】匹配以小写字母作为行首的内容

"^[a-z]" 

[]:可接受字符通配符,也就是[]中的任意内容,因此大写字母也可以写成[A-Z],数 字可以写成[0-9]

^:表示行首,如果要表示行尾,则使用$ 因此,需要表示空行就是“^$”,行首和行尾中间没有内容。

【例2】匹配行首为s,6位字母的内容

"^s[a-z][a-z][a-z][a-z][a-z]" 

"^s[a-z]{5}" #使用{N}表示执行多次 

{N}表示执行多次是grep命令的扩展用法,因此,需要写成egrep;另外如果有以s为 行首,7位字母的内容也会匹配,因为它也能够符合以上命令。

【例3】匹配以host开头,后面可能是2-4个数字的不确定情况

"^host([0-9]{2,4})?" 

()?:表示括号中的内容可能存在也可能不存在

{2,4}: 表示重复2-4次

【例4】匹配以h**t的内容,缺失了中间两个字符

"h..t" #使用(.)表示匹配任意字符 

如果中间缺失的字符数量也不清楚,可以使用无限制通配符(),表示在()前面的一 个字符可以为任意数量。示例:h.*t表示h和t中间可以有任意数量的任意字符

【例5】匹配[0-9]的文本内容

"\[0\-9\]" #使用转义符(\)实现特殊字符的转义 

也可以写成 \[0-9] ,就可以实现转义

【例6】匹配[0-9]或{5}的文本内容

"\\[0-9]|\\{5}" #使用竖线(|)表示“或”逻辑,等价于grep的-e选项 

【例7】匹配带有一个b或者多个b的内容

"b+" #使用加号(+)表示一个或多个 

【例8】匹配文件中的电话号码

方法一:

"[0-9]{11}"  

方法二:

"^1[0-9]{10}$"

规则语法

[0-9] 数字

[a-z] 小写字母

[A-Z] 大写字母

[xyz]:字符集合,匹配所包含的任意一个字符

. :匹配任意单个字符

?:前面的字符出现0次或1次

+:前面的字符出现1次或多次(ab+ abb abbbb abbbbbbb)

*:前面的字符出现0次或多次

^:输入字符串的开始位置

$:输入字符串的结束位置

{3} 前面的字符出现3次

{3,5} 前面的字符出现3—5次

{3,} 前面的字符出现3次以上

{,5} 前面的字符出现5次以下

正则表达式中”|“代表”或“

Linux基础:Shell 编程和Shell脚本(20210720笔记)_第13张图片

练习:有实际意义的脚本

完整版的批量创建用户

根据文件创建用户、设置密码

跳过已有用户


准备文件:用户名、密码

循环,每次一行

把这一行拆分,分成用户名、密码

判断上一个命令的返回值,0则输入密码
Linux基础:Shell 编程和Shell脚本(20210720笔记)_第14张图片

简化版服务器巡检:自动检测磁盘空间剩余

sed 对行做处理

awk 对列做处理
Linux基础:Shell 编程和Shell脚本(20210720笔记)_第15张图片
(此处是超过15%则报警)

你可能感兴趣的:(学习笔记,shell,正则表达式,linux)