linux-shell脚本的基础
1 shell 基本语法
2 SHELL变量及运用
1.1 SHELL是什么
Shell是一个命令解释器,我们俗称为壳,它是接收用户输入相关命令,解释给操作系统,并处理各种各样的操作系统的输出结果,并将结果输出给用户。
1.2 shell 脚本
shell 脚本:就是把原来在linux 命令或者语句放到一个文件中,然后通过这个调用这个文件程序,执行文件中的相关内容,这个程序就是shell脚本。
建立一下shell脚本。
[root@localhost ~]# vim test.sh
#!/bin/bash
# this is shell
touch abc.txt
mkdir abc
#!/bin/bash 作用:告诉肢本使用的是那种命令解释器
#在shell 中,是注释的意思,不会执行,一般作为这个shell 中解释下面代码中的作用。
shell程序一般以.sh结尾。
1.3执行的方式:
(1)如果是以路径方式执行这个shell脚本,需要给一个执行的权限。chmod +x test.sh
执行这个程序输入:./test.sh或者/root/test.sh
(2)bash test.sh 或者sh test.sh
(3)source test.sh
2 SHELL变量及运用
2.1变量基础了解
变量是shell 传递数据的一种方法。变量是用来代表每个值的符号名。我们可以把变量当成一个容器,通过变量,可以在内存中存储数据。也可以在脚本执行中进行修改和访问存储的数据
变量的设置规则:
1、 变量名称通常是大写字母,它可以由数字、字母(大小写)和下划线_组成。变量名区分大小写;但是变量名称不能以数字开头
2、 等号 = 用于为变量分配值,在使用过程中等号两边不能有空格
3、 变量存储的数据类型是整数值和字符串值
4、 在对变量赋于字符串值时,建议大家用引号将其括起来。因为如果字符串中存在空格隔符号。需要使用单引号或双引号
5、 要对变量进行调用,可以在变量名称前加美元符号$
6、 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用${变量名}包含
变量的分类
按照变量的作用可以分成4类:
1、用户自定义变量
2、环境变量:这种变量中主要保存的是和系统操作环境相关的数据。
3、位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
4、预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
按照变量作用域可以分成2类:
全局变量和局部变量。
局部变量是shell 程序内部定义的,其使用范围仅限于定义它的程序,对其它程序不可见。包括:用户自定义变量、位置变量和预定义变量。
全局变量是环境变量,其值不随shell 脚本的执行结束而消失。
2.2用户定义变量
变量名命名规则:由字母或下划线打头,不允许数字开头,后面由字母、数字或下划线组成,并且大小写字母意义不同。在使用变量时,在变量名前加$
例1:
[root@localhost ~]# abc1=222333
[root@localhost ~]# echo $abc1
222333
例2 :
变量值的叠加,使用${}
$name是${name}的简化版本,但是在某些情况下,还必须使用花括号引起的方式来消除歧义并避免意外的结果
[root@localhost ~]# abc1=222333
[root@localhost ~]# echo $abc1
222333
[root@localhost ~]# abc2=air
[root@localhost ~]# echo $abc22
[root@localhost ~]# echo ${abc2}22
air22
2.3 命令的调用,命令替换用$()或反引号
以date 为例:
te命令是显示或设置系统时间与日期。
-s<字符串>:根据字符串来设置日期与时间。字符串前后必须加上双引号;
<+时间日期格式>:指定显示时,使用特定的日期时间格式。
[root@localhost ~]# date
Sun Mar 15 01:05:38 CST 2020
[root@localhost ~]# date +%y-%m-%d
20-03-15
[root@localhost ~]# date +%Y-%m-%d
2020-03-15
[root@localhost ~]# date +%y-%m
20-03
[root@localhost ~]# date +"%y-%m-%d %H:%m:%s"
20-03-15 01:03:1584205822
[root@localhost ~]# date +"%y-%m-%d %H:%M:%S"
20-03-15 01:10:43
%y 年份只显示2位, %Y年份显示4位
date命令加减操作:
[root@localhost ~]# date -d "-1 day" +%Y%m%d
20200314
[root@localhost ~]# date -d "-1 month" +%Y%m%d
20200215
[root@localhost ~]# date -d "-1 year" +%Y%m%d
20190315
设定时间:
[root@localhost ~]# date -s 20180520
Sun May 20 00:00:00 CST 2018
[root@localhost ~]# date -s "20180520 01:01:01"
Sun May 20 01:01:01 CST 2018
在命令中调用date命令输出值
[root@localhost ~]# echo `date`
Sun May 20 01:01:27 CST 2018
[root@localhost ~]# echo $(date)
Sun May 20 01:01:49 CST 2018
[root@localhost ~]# echo `date +"%Y-%m-%d"`
2018-05-20
2.4 shell中单引号和双引号区别
‘’ 在单引号中所有的字符包括特殊字符($,'',`和\)都将解释成字符本身而成为普通字符。
“” 在双引号中,除了$, '', `和\以外所有的字符都解释成字符本身,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义
注:\转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出“$”符号,而不当做是变量引用
[root@localhost ~]# echo $abc1
222333
[root@localhost ~]# echo \$abc1
$abc1
给变量值赋于多个单词,需要使用单引号和双引号
赋值时单引号和双引号的区别
[root@localhost ~]# abc2='kezi $abc1'
[root@localhost ~]# abc3="kezi $abc1"
[root@localhost ~]# echo $abc2
kezi $abc1
[root@localhost ~]# echo $abc3
kezi 222333
删除变量
[root@localhost ~]# unset abc3
[root@localhost ~]# echo $abc3
2.6 环境变量
在bash shell中,环境变量分为两类:全局变量和局部变量
全局变量:对于shell会话和所有的子shell都是可见的
局部变量: 它只在自己的进程当中使用
[root@localhost ~]# export abc1 #设置全局变量
[root@localhost ~]# env #查看全局变量
测试全局和局部变量
[root@localhost ~]# vim a.sh
#!/bin/bash
echo $abc1
echo $abc2
"a.sh" [New] 3L, 34C written
[root@localhost ~]# echo $abc2
kezi $abc1
[root@localhost ~]# echo $abc1
222333
[root@localhost ~]# sh a.sh
222333
虽然我们设置了export全局变量,但是新开的xshell连接中,还是读不到变量VAR1
让变量永久生效,可以把定义好的变量写入配置文件
当登录系统或新开启一个ssh连接启动bash进程时,一定会加载这4个配置文件:
# vim /etc/profile #系统全局环境和登录系统的一些配置
# vim /etc/bashrc #shell全局自义配置文件,用于自定义shell
# vim /root/.bashrc #用于单独自定义某个用户的bash
# vim /root/.bash_profile #用户单独自定义某个用户的系统环境
插入永久变量:
# vim /etc/profile #在文件的最后插入
export VAR9=xuegod #=等号两边不能有空格
# source /etc/profile #重新加载profile文件
2.7 设置PATH环境变量
SHELL要执行某一个程序,它要在系统中去搜索这个程序的路径,path变量是用来定义命令和查找命令的目录,当我们安装了第三方程序后,可以把第三方程序bin目录添加到这个path路径内,就可以在全局调用这个第三方程序的
例:建立一个as.sh 可以直接访问
[root@localhost ~]# mkdir /opt/back
[root@localhost ~]# vim /opt/back/as.sh
#!/bin/bash
echo "this is linux"
~
[root@localhost ~]# chmod +x /opt/back/as.sh
[root@localhost ~]# /opt/back/as.sh
this is linux
[root@localhost ~]# as.sh 不能直接访问
-bash: as.sh: command not found
as.sh命令添加PATH中
临时生效
[root@localhost ~]# PATH=/opt/back/:$PATH
[root@localhost ~]# as.sh
this is linux
永久生效
[root@localhost ~]# vim /etc/profile
export PATH=/opt/back/:$PATH
"/etc/profile" 77L, 1848C written
[root@localhost ~]# source /etc/profile
[root@localhost ~]# as.sh
this is linux
2.7 shell位置变量
Shell解释执行用户的命令时,将命令行的第一个字符作为命令名,而其它字符作为参数。
$0 获取当前执行shell脚本的文件文件名,包括脚本路径,命令本身
$n 获取当前脚本的第n个参数 n=1,2.....n 当n大于9时 用${10}表示。
[root@localhost ~]# vim display.sh
#!/bin/bash
echo " 本shell 脚本的文件名:"$0
echo "第一个参数:"$1
echo "第二个参数:"$2
echo "第三个参数:"$3
echo "第四个参数:"$4
[root@localhost ~]# chmod +x display.sh
[root@localhost ~]# ./display.sh 111 222 333 444
本shell 脚本的文件名:./display.sh
第一个参数:111
第二个参数:222
第三个参数:333
第四个参数:444
使用场景:服务器启动传参数
[root@localhost ~]# /etc/init.d/network restart
Restarting network (via systemctl): [ OK ]
2.8 特殊变量
有些变量是一开始执行Script脚本时就会设定,且不能被修改,但我们不叫它只读的系统变量,而叫它特殊变量。这些变量当一执行程序时就有了,以下是一些特殊变量:
$* | 以一个单字符串显示所有向脚本传递的参数; 如"$*"用【"】括起来的情况、以"$1 $2 … $n"的形式输出所有参数 |
$# | 传递到脚本的参数个数 |
$$ | 当前进程的进程号PID |
$? | 显示最后命令的退出状态;0表示没有错误,其他任何值表明有错误 |
$! | 后台运行的最后一个进程的进程号pid |
例:
[root@localhost ~]# vim display1.sh
#!/bin/bash
echo "$* 表示所有参数”"
echo "$# 表示这个程序的参数个数"
echo "$$ 表示程序的进程ID"
echo "$! 表示上一个后台的PID"
[root@localhost ~]# sh display1.sh 22 33 44
22 33 44 表示所有参数”
3 表示这个程序的参数个数
11135 表示程序的进程ID
表示上一个后台的PID
3 数学运算
3.1 expr命令
(1)对数字的基本计算,做比较时,输出结果假为0,1为真;特殊符号用转义符
[root@localhost ~]# expr 2 \> 1
1
[root@localhost ~]# expr 3 \* 5
15
(2)对字符串的处理
[root@localhost ~]# expr length "aabbcc"
6
[root@localhost ~]# expr substr "aabbcc" 2 4
abbc
3.2 使用$(( ))
格式:$((表达式1,表达2))
特点:
1、在双括号结构中,所有表达式可以像c语言一样,如:a++,b--等。a++ 等价于 a=a+1
2、在双括号结构中,所有变量可以不加入:“$”符号前缀。
3、双括号可以进行逻辑运算,四则运算
4、双括号结构 扩展了for,while,if条件测试运算
5、支持多个表达式运算,各个表达式之间用“,”分开
常用的算数运算符
运算符 | 意义 |
++ -- | 递增及递减,可前置也可以后置 |
+ - ! ~ | 一元运算的正负号 逻辑与取反 |
+ - * / % | 加减乘除与余数 |
< <= > >= | 比较大小符号 |
== != | 相等 不相等 |
>> << | 向左位移 向右位移 |
& ^ | | 位的与 位的异或 位的或 |
&& || | 逻辑与 逻辑或 |
? : | 条件判断 |
[root@localhost ~]# c=$((3+8))
[root@localhost ~]# echo $c
11
[root@localhost ~]# echo $((c++))
11
[root@localhost ~]# echo $((++c))
13
c++或c--为先赋值再+1或减1 ; ++c或--c为先加1或减1,然后再进行赋值
[root@localhost ~]# echo $((100*(1+100)/2))
5050