c#发展

首页 » 常识 » 预防 » Linux系统操作方法Linux一学就
TUhjnbcbe - 2024/5/18 16:26:00
白癜风治疗偏方 https://m.39.net/baidianfeng/a_4197040.html

Linux云计算集群架构师

第十九章shell脚本的基础

本节所讲内容:

19.1shell基本语法

19.2SHELL变量及运用

19.3数学运算

19.4实战-升级系统中的java版本到1.8版本

19.1shell基本语法

19.1.1什么是shell?

Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈给用户。这种对话方式可以是交互式也可以是非交互式的

  我们所输入的命令计算机是不识别的,这时就需要一种程序来帮助我们进行翻译,变成计算机能识别的二进制程序,同时又把计算机生成的结果返回给我们。

当前终端使用的哪种shell?

大多数linux发行版本默认shell使用的是bash

19.1.2扩展:编程语言分类

编程语言主要用:低级语言和高级语言

1)低级语言:

机器语言:二进制语言

汇编语言:符号语言,使用助记符来代替操作码,也就是用符号代替机器语言的二进制码

它们都是面向机器的语言

2)高级语言:

它是比较接近自然语言或者说人类语言的一种编程,用人们能够容易理解的方式进行编写程序,

  静态语言:编译型语言如:c、c++、java,

动态语言:解释型语言如:php、shell、python、perl

gcc编译器:(解释器)将人类理解的语言翻译成机器理解的语言

静态语言和动态语言的区别:

静态语言编译时,变量的数据类型是确定的,静态语言对硬件更友好,运行效率更高。

动态语言,运行时确定变量的数据类型,且运行时可改变变量的类型。动态语言更简洁,对人类更友好,可以把更多精力放在业务逻辑上。

19.1.3什么是SHELL脚本?

shell脚本:就是说我们把原来linux命令或语句放在一个文件中,然后通过这个程序文件去执行时,我们就说这个程序为shell脚本或shell程序;我们可以在脚本中输入一系列的命令以及相关的语法语句组合,比如变量,流程控制语句等,把他们有机结合起来就形成了一个功能强大的shell脚本。

先手写一个脚本体验一下:

[root

xuegod63~]#vimtest.sh#写入以下内容

#!/bin/bash

#Thisisshell.

echo"helloworld"

mkdir/tmp/test

touch/tmp/test/a.txt

注释:

1、!/bin/bash作用:告诉脚本使用的是哪种命令解释器。如不指shell,以当前shell作为执行的shell。

2、在shell中以#表示开头,整个行就被当作一个注释。执行时被忽略。

3、shell程序一般以.sh结尾

[root

xuegod63~]#chmod+xtest.sh

[root

xuegod63~]#./test.sh#执行

helloworld

创建shell程序的步骤:

第一步:创建一个包含命令和控制结构的文件。

第二步:修改这个文件的权限使它可以执行。使用chmod+xtest.sh

第三步:检测语法错误bash-xabc.sh

第四步:执行./example

shell脚本的执行通常有以下几种方式

1、/root/test.sh或者./test.sh(当前路径下执行脚本的话要有执行权限chmod+xtest.sh)

2、bashtest.sh或shtest.sh(这种方式可以不对脚本文件添加执行权限)

3、sourcetest.sh(可以没有执行权限).test.sh

4、shtest.sh或者cattest.sh

sh(bash)

19.2SHELL变量及运用

19.2.1shell变量

变量是shell传递数据的一种方法。变量是用来代表每个值的符号名。我们可以把变量当成一个容器,通过变量,可以在内存中存储数据。也可以在脚本执行中进行修改和访问存储的数据

变量的设置规则:

1.变量名称通常是大写字母,它可以由数字、字母(大小写)和下划线_组成。变量名区分大小写;但是大家要注意变量名称不能以数字开头

2.等号=用于为变量分配值,在使用过程中等号两边不能有空格

3.变量存储的数据类型是整数值和字符串值

4.在对变量赋于字符串值时,建议大家用引号将其括起来。因为如果字符串中存在空格符号。需要使用单引号或双引号

5.要对变量进行调用,可以在变量名称前加美元符号$

6.如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用${变量名}包含

变量的分类

按照变量的作用可以分成4类:

1、用户自定义变量

2、环境变量:这种变量中主要保存的是和系统操作环境相关的数据。

3、位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。$1$2…

4、预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

按照变量作用域可以分成2类:全局变量和局部变量。

局部变量是shell程序内部定义的,其使用范围仅限于定义它的程序,对其它程序不可见。包括:用户自定义变量、位置变量和预定义变量。

全局变量是环境变量,其值不随shell脚本的执行结束而消失。

19.2.2用户定义变量

变量名命名规则:由字母或下划线打头,不允许数字开头,后面由字母、数字或下划线组成,并且大小写字母意义不同。在使用变量时,在变量名前加$

例1:给变量var1赋值

[root

xuegod63~]#var1=

[root

xuegod63~]#echo$var1

variable[veribl]变量

例2:错误的赋值方式,不允许数字开头,等号两边不能有空格

[root

xuegod63~]#var2=

bash:var2:未找到命令...

[root

xuegod63~]#var2=

bash::未找到命令...

[root

xuegod63~]#var2=

bash:var2:未找到命令...

[root

xuegod63~]#3var2=

bash:3var2:未找到命令...

例3:变量值的叠加,使用${}

$name是${name}的简化版本,但是在某些情况下,还必须使用花括号引起的方式来消除歧义并避免意外的结果

[root

xuegod63~]#var4=mysql  

[root

xuegod63~]#echo$var4

mysql

[root

xuegod63~]#echo$var4-db.log

mysql-db.log

[root

xuegod63~]#echo$var4.db.log

mysql.db.log

[root

xuegod63~]#echo$var4db.log  #发现输出的结果不是我们想要的,怎么办?

.log

[root

xuegod63~]#echo${var4}db.log

mysqldb.log

19.2.3命令的替换,使用$()或反引号

例1:在命令中调用date命令输出值

[root

xuegod63~]#echo`date`

年05月25日星期五17:41:29CST

[root

xuegod63~]#echo$(date)

年05月25日星期五17:41:42CST

[root

xuegod63~]#echo`date+"%Y-%m-%d"`

-05-23

[root

xuegod63~]#echo`date+%F`

-05-23

[root

xuegod63~]#echo$(date+%F)

-05-23

分享一个系统时间错误,引起tar报警告

[root

xuegod63~]#date-s"-03-:25:00"

[root

xuegod63~]#tarczvfroot.tar.gz/root/.cache/tracker/db-version.txttarxvfroot.tar.gz-C/opt/

root/.cache/tracker/db-version.txt

tar:root/.cache/tracker/db-version.txt:时间戳-09-:05:18是未来的.秒之后

注:如果弹出这个消息,是因为咱们的当前系统的时间不对。比如:当前系统的时间晚于文件的mtime时间

[root

xuegod83~]#hwclock-s#以硬件时间为基准,修改系统时间

19.2.4shell中单引号和双引号区别

‘’  在单引号中所有的字符包括特殊字符($,,`和\)都将解释成字符本身而成为普通字符(所见即所得)。

“”  在双引号中,除了$,,`反引号和\以外所有的字符都解释成字符本身,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义

注:\转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出“$”符号,而不当做是变量引用

例:

[root

xuegod63~]#echo$var1

[root

xuegod63~]#echo\$var1

$var1

例1:给变量值赋于多个单词,需要使用单引号和双引号

[root

xuegod63~]#var8=xuegoduser1

[root

xuegod63~]#echo$var8

xuegdouser1

例2:赋值时单引号和双引号的区别

[root

xuegod63~]#var8=xuegoduser1$var1

[root

xuegod63~]#var9="xuegoduser1$var1"#双引中$符号有作用

[root

xuegod63~]#echo$var8

xuegoduser1$var1

[root

xuegod63~]#echo$var9

xuegoduser1

注:单引号之间的内容原封不动赋值给变量,双引号之间的内容如有特殊符号会保留它的特殊含义

例3:赋值时单引号和双引号的区别

[root

xuegod63~]#vimvar.sh

#!/bin/bash

var=88

echo"$var"

echo$var

echo"$var"

echo"$var"

当单独使用双引号时,可以取出变量值

当单独使用单引号时,不能取出变量值

当外层使用双引号时,输出内层的单引号和变量值

当外层使用单引号时,输出内层的双引号和双引号中的内容。

删除变量

[root

xuegod63~]#unsetvar1

[root

xuegod63~]#echo$var1

19.2.5环境变量

在bashshell中,变量分为两类:全局变量和局部变量

全局变量:对于shell会话和所有的子shell都是可见的

局部变量:它只在自己的进程当中使用

例1:局部变量

[root

xuegod63~]#var1=

[root

xuegod63~]#var2=

[root

xuegod63~]#echo$var1

[root

xuegod63~]#vima.sh

#!/bin/bash

echo$var1

echo$var2

[root

xuegod63~]#echo$var1$var2

[root

xuegod63~]#basha.sh#执行a.sh时,会使用另一个bash去执行,就访问不到$var1和var2的值

例2:使用export把这个var1局部变量输出为全局变量

[root

xuegod63~]#exportvar1=xuegod

[root

xuegod63~]#echo$var1$var2

xuegod

[root

xuegod63~]#cata.sh

#!/bin/bash

echo$var1

echo$var2

[root

xuegod63~]#basha.sh#引用全局变量var1成功

xuegod

env环境变量全局变量

虽然我们设置了export全局变量,但是新开的xshell连接中,还是读不到变量var1,怎么办?

例3:让变量永久生效,可以把定义好的变量写入配置文件

当登录系统或新开启一个ssh连接启动bash进程时,一定会加载这4个配置文件:

[root

xuegod63~]#vim/etc/profile#系统全局环境和登录系统的一些配置

[root

xuegod63~]#vim/etc/bashrc#bash全局自义配置文件,用于自定义shell

[root

xuegod63~]#vim/root/.bashrc#用于单独自定义某个用户的bash

[root

xuegod63~]#vim/root/.bash_profile#用户单独自定义某个用户的系统环境

下面开始插入永久变量:

[root

xuegod63~]#vim/etc/profile#在文件的最后插入

exportvar1=xuegod#=等号两边不能有空格

[root

xuegod63~]#source/etc/profile#重新加载profile文件

新打开的链接中,也有了

如何知道新建一个ssh连接,加载这4个配置文件先后顺序?

答:可以每个文件的最后,追加一个echo命令,输出一下文件的名字

[root

xuegod63~]#echoecho/etc/profile/etc/profile

[root

xuegod63~]#echoecho/etc/bashrc/etc/bashrc

[root

xuegod63~]#echoecho/root/.bashrc/root/.bashrc

[root

xuegod63~]#echoecho/root/.bash_profile/root/.bash_profile

[root

xuegod63~]#sshroot

..1.63#弹出以下信息,就知道有优先级了

/etc/profile

/etc/bashrc

/root/.bashrc这个文件会判断/etc/bashrc是否存在,存在则激活

/root/.bash_profile

19.2.6设置PATH环境变量  

SHELL要执行某一个程序,它要在系统中去搜索这个程序的路径,PATH变量是用来定义命令和查找命令的目录,当我们安装了第三方程序后,可以把第三方程序bin目录添加到这个path路径内,就可以在全局调用这个第三方程序了

例1:

[root

xuegod63~]#vim/opt/backup

#!/bin/bash

echo"BackupdataisOK!"

[root

xuegod63~]#chmod+x/opt/backup

[root

xuegod63~]#/opt/backup

[root

xuegod63~]#backup

bash:backup:未找到命令...

将backup命令添加PATH中

[root

xuegod63~]#echo$PATH

[root

xuegod63~]#PATH=/opt/:$PATH

[root

xuegod63~]#echo$PATH

[root

xuegod63~]#backup#发现命令可以直接执行了,不用写全路径了

[root

xuegod63~]#vim/etc/profile#在文件最后追加以下内容,永久生效

exportPATH=/opt/:$PATH

[root

xuegod63~]#source/etc/profile#重新加载配置文件,使用配置生效

19.2.7shell位置变量

Shell解释执行用户的命令时,将命令行的第一个字符作为命令名,而其它字符作为参数。

$0获取当前执行shell脚本文件的文件名,包括脚本路径,命令本身

$n获取当前脚本的第n个参数n=1,2.....n当n大于9时用${10}表示。

例子:

[root

xuegod63~]#vimprint.sh

#!/bin/bash

echo"本shell脚本的文件名:$0"

echo"第1个参数:$1"

echo"第2个参数:$2"

echo"第3个参数:$3"

echo"第4个参数:$4"

[root

xuegod63~]#chmod+xprint.sh

[root

xuegod63~]#./print.sha.txt

本shell脚本的文件名:./print.sh

第1个参数:

第2个参数:

第3个参数:a.txt

第4个参数:

使用场景:服务器启动传参数

[root

xuegod63~]#/etc/init.d/networkrestart

19.2.8特殊变量(预定义变量)

有些变量是一开始执行Script脚本时就会设定,且不能被修改,但我们不叫它只读的系统变量,而叫它特殊变量。这些变量当执行程序时就有了,以下是一些特殊变量:

[root

xuegod63~]#vimtest_var.sh

#!/bin/bash

echo"$*一个字符串显示这个程序的所有参数"

echo"$#表示这个程序的参数个数"

touch/tmp/a.txt

echo"$$表示当前进程的进程号PID"

touch/tmp/b.txt

echo"$!表示上一个后台运行的进程的PID"

echo"$?表示上一个程序执行返回结果"

[root

xuegod63~]#bashtest_var.sh45

45表示这个程序的所有参数

5表示这个程序的参数个数

表示当前进程的进程号PID

表示上一个后台运行的进程的PID

0表示上一个程序执行返回结果

例2:常用的环境变量

[root

xuegod63~]#cd/opt

[root

xuegod63opt]#vimenv.sh

#!/bin/bash

echo\$HOME变量值是$HOME

echo\$PATH变量值是$PATH

echo\$PWD变量值是$PWD

[root

xuegod63opt]#bashenv.sh

$HOME变量值是/root

$PATH变量值是/opt/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

$PWD变量值是/opt

declare声明变量类型

declare[+/-][选项]变量名

-:给变量设定类型属性

+:取消给变量设定类型属性

-i将变量声明为整数型

-x将变量声明为环境变量等同于exprot

-r将变量声明为只读变量

-p显示指定变量的被声明类型

[root

xuegod83~]#declare-inum

[root

xuegod83~]#num=1

[root

xuegod83~]#echo$num

1

[root

xuegod83~]#num=abc

[root

xuegod83~]#echo$num

[root

xuegod83~]#declare+inum

[root

xuegod83~]#num=abc

[root

xuegod83~]#echo$num

abc

[root

xuegod83]#a=

[root

xuegod83]#b=

[root

xuegod83]#c=$a+$b

[root

xuegod83]#echo$c

+

[root

xuegod83]#declare-ic=$a+$b

[root

xuegod83]#echo$c

[root

xuegod83~]#declare-xabc

[root

xuegod83~]#abc=

[root

xuegod83~]#env

grepabc

abc=

19.3数学运算

19.3.1expr命令

(1)对数字的基本计算,做比较时,输出结果假为0,1为真;特殊符号用转义符

[root

xuegod63~]#expr2\5

[root

xuegod63~]#expr6\5

1

[root

xuegod63~]#expr3*5

expr:语法错误

[root

xuegod63~]#expr3\*5

15

[root

xuegod63~]#expr3\+5·

8

(2)对字符串的处理

[root

xuegod63~]#exprlength"nihao"

6

[root

xuegod63~]#exprsubstr"nihao"24#从第2个开始,截取4个字符出来

iha

字符串提取

第一种模式:${var:num},这种模式时,shell在var中提取第n个字符到末尾的所有字符。若n为正数,从左边0处开始;若n为负数,从右边开始提取字串,但必须使用在冒号后面加空格或整个n加上小括号,如${var:-2}、${var:(-2)}。

[root

xuegod63~]#var=
1
查看完整版本: Linux系统操作方法Linux一学就