Shell脚本(1):脚本基础

363 阅读4分钟

一、 shell的作用

Shell(壳) 是一类程序的总称,用于将人类使用的高级语言转换成机器能看懂的二进制语言,为用户和内核之间的交互提供接口。

二、 shell脚本简介

1.1 什么是shell脚本?

Shell脚本是一种用于编写和执行命令序列的脚本语言 Shell脚本可以通过文本文件的形式保存,并使用shell解释器来执行。 Shell脚本可以包含命令、条件判断、循环、函数等,可以使用变量、数组、字符串处理、文件操作等功能。

1.2 应用场景

将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率 减少手工命令的重复输入,一定程度上避免人为错误 将软件或应用的安装及配置实现标准化 用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等

2. Shell脚本构成

以一个简单的shell脚本为例

#!/bin/bash#打印当前日期和时间echo "当前日期和时间:"
date#创建一个目录mkdir test#进入该目录cd test#创建一个文件并写入内容echo "Hello, World!" > t1.txt
​
#显示文件内容cat t1.txt

#!/bin/bash 使用Bash解释器执行脚本。

echo "当前日期和时间:" 使用echo命令打印一段文本,即"当前日期和时间:"。

date 输出当前的日期和时间。

mkdir mydirectory 创建一个名为test的目录。

cd test 进入test目录。

echo "Hello, World!" > myfile.txt 将"Hello, World!"写入到t1.txt文件中

cat myfile.txt显示t1.txt文件的内容。

3. Shell脚本执行方式

以/test/t1.sh为例 1 想要用tab键补全脚本名,需要做软链接,将目标脚本链接到$PATH的目录下。 1

3.1 路径方式 (需要赋予执行权限)

绝对路径

/test/t1.sh 相对路径

cd /test ./t1.sh

3.2 指定shell解释器去执行(不需要权限)

bash /test/t1.sh

3.3 source 和 . (不需要权限)

source命令会直接在当前shell中执行脚本文件的内容,会直接影响当前shell的环境,所以不推荐用这种方式。

#执行方式三#
source 脚本名(绝对路径)
​
source /test/t1.sh 
或者
. /test/t1.sh 

4. Shell脚本错误调试

语法错误 会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的。

命令错误 默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察。

逻辑错误 只能使用 bash -x 进行排错。 bash -x #模拟执行,可以逐条排错

bash -n #检查语法错误

二、重定向与管道符

1. 重定向

类型设备文件文件描述编号默认设备
标准输入/dev/stdin0键盘
标准输出/dev/stdout1显示器
标准错误输出/dev/stderr2显示器

交互式硬件设备

  • 标准输入:从该设备接收用户输入的数据
  • 标准输出:通过该设备向用户输出数据
  • 标准错误:通过该设备报告执行出错信息

重定向的意思就是 ,不输出到默认设备上,输出到你指定的位置(文件 其他输出设备)

类型操作符用途
重定向输入<从指定的文件读取数据,而不是从键盘输入
重定向输出1>将输出结果保存到指定的文件(覆盖原有内容)
>>将输出结果追加到指定的文件尾部
标准错误输出2>将错误信息保存到指定的文件(覆盖原有内容)
2>>标准错误输出结果追加到指定的文件尾部
混合输出&>无论对错都可以重定向将标准输出、标准错误的内容保存到同一个文件中

2. 管道符

管道符     命令1  |  命令2   
​

将管道符号“|"左侧的命令输出的结果,作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。

三、Shell脚本变量

1. 变量简介

1.1 作用

Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。

1.2 变量类型

自定义变量:由用户自己定义,修改和使用。

特殊变量:环境变量、只读变量、位置变量、预定义变量。

2. 自定义变量

2.1 定义新变量

变量名=变量值 
#=号前后不能有空格

2.2 查看自定义的变量

echo $变量名

#查看变量值

[root@localhost ~]# name=huang
[root@localhost ~]# echo $name
huang
​

2.3 赋值时的特殊符号

1.赋值时使用双引号(" ")可以直接调用变量

2.赋值时使用单引号(' ')变量只会被认为是字符不会调用变量

3.赋值时使用(``反撇在tab上面)命令替换,提取命令执行后的输出结 果 和$( ) 用法相同

4.{}可以分隔变量值

单引号不识别 变量

双引号可以识别变量

{} 可以确定变量的范围

`` $() 调用命令执行的结果

2.4 read -p

read -p 是一个常用的Bash命令,用于从用户输入中读取值并将其存储在变量中。 -p 选项用于显示提示信息,提示用户输入。

[root@localhost ~]# . hello.sh 
请输入你的名字:hzw
你好,hzw! 
​

2.5 将局部变量变为全局变量

局部变量:新定义的变量只在当前的shell环境中有效,当进入子程序或新的shell环境中,局部变量将无法再起作用。

全局变量:在新的shell环境中可以继续使用。

通过内部命令export将局部变量为全局变量。

格式1:export 变量名 格式2:export 变量名=变量值

3. 环境变量

环境变量由系统提前创建,用来设置用户的工作环境。

env   #可以看到当前所有的环境变量

3.1 环境变量的全局配置文件

#配置文件位置
/etc/profile 
##修改此文件,全局生效,可用于长期变更或设置环境变量

4. 只读变量

将变量声明为只读(read-only)后,不能再修改变量的值。

readonly 变量名 #将变量声明为只读变量

5. 位置变量

1,1, 2, 3,3, … n 表示命令行参数的位置值

1表示第一个参数,1 表示第一个参数,2 表示第二个参数,以此类推。

当n大于9时,需要加上{ },比如第十个位置,要用 ${10}表示

#以shell脚本为例
#!/bin/bash
echo "$1"            #位置1
echo "$2"            #位置2
echo "$3"            #位置3
echo "${10}"         #位置10
echo "$10"           #位置1和0

6. 预定义变量(重要)

  • $*:表示所有位置参数的内容看成一个整体返回 返回所有
  • $@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
  • $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
  • $#:表示命令行中位置参数的总个数
  • $0:表示当前执行的脚本或程序的名称 当前脚本的名字
  • $!: 后台任务最后一个id

7. 整数运算

#运算符
+ 加法
- 减法
* 乘法
/ 除法
% 取余
​
#运算法则
加法:num1 + num2
减法:num1 - num2
乘法:num1 \ * num2
整除:num1 / num2
取余(求模):num1 % num2 (求 num1 除以 num2 的余数)
​
#变量和运算符之间要用空格隔开
#expr只能进行整数的运算
#格式
expr 变量1 运算符 变量2 [运算符 变量3]

i++和++i

i=1;j=1;let j=i++;echo $i $j
2 1
i=1;j=1;let j=++i;echo $i $j
2 2

四、简单的Shell脚本

使用shell脚本搭建本地yum仓库

#脚本名称 lyum.sh
#脚本内容##!/bin/bash
 
mount /dev/sr0 /mnt
​
cd /etc/yum.repos.d
​
mkdir backup
mv *.repo backup
​
echo "
[local]
name=local
baseurl=file:///mnt
grpcheck=0
" > local.repo
​

五、部分文本处理工具

1. tr命令

tr命令用于字符转换或字符删除。

1.1基本格式

tr [选项] 字符集1 字符集2 #字符集1 是要被替换或删除的字符集 #字符集2 是要替换为的字符集

1.2常用选项

-c 除了指定的字符之外的所有字符都会被替换 -d 表示删除指定的字符 -s 表示压缩重复的字符为单个字符

[root@localhost /]# echo 123 |tr 1  2
223
#将文本中的空格合并为单个空格
[root@localhost /]# echo "Hello    World" | tr -s ' '
Hello World
#删除文本中的特殊字符
[root@localhost /]# echo "Hello @#World" | tr -d '@#'
Hello World
​

2. cut命令

cut命令可以提取文本数据中指定的列。 cut命令可以根据指定的字符位置或指定的字段分隔符来截取文本,并将结果输出到标准输出或指定的文件。

2.1 基本格式

cut [选项] 文件

-d 指定字段的分隔符,默认为制表符。 -f 指定要提取的字段列表,字段列表之间使用逗号分隔,例如-f 1,3,5 -c 指定要提取的字符位置列表,字符位置列表之间使用逗号分隔,例如-c 1-5,10-15 --complement 提取指定字段或字符位置之外的内容

#提取文件的第一列cut -f1 file.txt
​
​
#提取文件的第二、四、五列,并使用逗号作为分隔符cut -f2,4,5 -d',' file.txt
​
​
#提取文件的前五个字符:cut -c1-5 file.txt
​
​
# 提取文件的第一列以外的所有列:cut -f 2 --complement file.txt
​

3. sort命令

sort命令用于对文本文件进行排序,默认以字母排序

3.1 基本格式

sort [选项] file

3.2 常用选项

-b 忽略行首空白字符 -r 以倒序方式进行排序 -f 忽略大小写进行排序 -n 按照数值大小进行排序 -u 去除重复行 -t 指定字段分隔符 -k 指定按照字段排序

4. uniq命令

uniq 命令用于找出或删除文本文件中连续出现的重复行

5. 基本格式

uniq [选项] [输入文件 [输出文件]]

#如果不指定输入文件,则会从标准输入获取数据 #如果不指定输出文件,则结果会打印到标准输出

6. 常用选项

-c 在输出结果中显示每行重复出现的次数。 -d 只显示重复行。 -u 只显示不重复的行。

[root@localhost /]# df|grep "sd"|tr -s " "|cut -d " " -f5|cut -d "%" -f1
18
#查看磁盘利用率