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    #查看全局变量

linuxshell脚本操作hadoop linux shell脚本入门_vim

 

 测试全局和局部变量

[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