shell脚本的基础

  • 内容大纲:
  • shell基本语法
  • SHELL变量及运用
  • 数学运算
  • 实战-升级系统中的java版本到1.8版本-为后期安装Hadoop集群做准备

一、shell基本语法
1、创建一个脚本

[root@xuegod140 ~]# vim test.sh
[root@xuegod140 ~]# cat test.sh
#!/bin/bash
#This is shell
echo “hello world”
cd /tmp
ls
cp /tmp/* /opt/
rm -rf /tmp/*
在这里插入图片描述

注释:
1)#!/bin/bash作用:告诉脚本使用的那种命令解释器。如果不指定shell,以当前shell作为执行的shell。比如当叫shell是zsh,那么就以zsh解释器执行这个脚本
2)在shell脚本中,以#开头的行,都是注释行,只有第一行加#是起到作用的
3)shell脚本一般都以.sh结尾

2、执行脚本的方法
1)/root/test.sh或者./test.sh 绝对路径或者相对路径执行脚本需要有执行权限
2)bash test.sh或者 sh test.sh 不需要执行权限
3)source test.sh 不需要执行权限
4)sh < test.sh 或cat test.sh | sh 不需要执行权限

二、shell变量及运用
1、shell变量的设置规则
1)变量名称通常都是大写,可以由数字、字母和下划线组成;但是变量名称不能以数字开头
2)等号 = 用于为变量进行赋值,=号两边都不能有空格
3)变量存储的数据类型是整数值和字符串值
4)在对变量赋予字符串值的建议使用引号括起来,因为在字符串中如果存在空格,需要使用单引号或双引号
5)对变量进行调用,需要在变量名称前加美元 符 号 6 ) 如 果 需 要 增 加 变 量 的 值 , 那 么 可 以 进 行 变 量 的 叠 加 。 不 过 对 变 量 叠 加 需 要 使 用 双 引 号 括 起 来 或 者 使 用 符号 6)如果需要增加变量的值,那么可以进行变量的叠加。不过对变量叠加需要使用双引号括起来或者使用 6使使()括起来
例子1:变量赋值

[root@xuegod140 ~]# VAR1=xuegod
[root@xuegod140 ~]# echo $VAR1
xuegod

例2:=号两边不能有空格

[root@xuegod140 ~]# VAR2 =xuegod
bash: VAR2: command not found…
[root@xuegod140 ~]# VAR2 = xuegod
bash: VAR2: command not found…
[root@xuegod140 ~]# VAR2= xuegod
bash: xuegod: command not found…

例3:字符串赋值

[root@xuegod140 ~]# VAR4=xue god
bash: god: command not found…
[root@xuegod140 ~]# VAR4=“xue god”
[root@xuegod140 ~]# echo $VAR4
xue god

例4:变量的叠加

[root@xuegod140 ~]# VAR5=Mysql
[root@xuegod140 ~]# echo ${VAR5}.log
Mysql.log
[root@xuegod140 ~]# VAR6=My
[root@xuegod140 ~]# VAR7=Love
[root@xuegod140 ~]# echo ${VAR6} ${VAR7}
My Love

2、$()和``符号的作用
括起来的内容可以写命令,用来在脚本内使用
例1:括起来执行里面的内容

[root@xuegod140 ~]# date
Tue Apr 30 22:14:09 CST 2019
[root@xuegod140 ~]# echo `date`
Tue Apr 30 22:14:21 CST 2019
[root@xuegod140 ~]# echo $(date)
Tue Apr 30 22:14:39 CST 2019

例2:$()嵌套使用

[root@xuegod140 ~]# VAR8=$(tar cvf /tmp/`date +%F`.tar /opt/ )
tar: Removing leading `/’ from member names
[root@xuegod140 ~]# echo $VAR8
/opt/ /opt/rh/ /opt/yum_save_tx.2019-04-27.23-33.Zj3hSy.yumtx

例3:变量的删除

[root@xuegod140 ~]# unset VAR1
[root@xuegod140 ~]# echo $VAR1

3、\转义符的使用
作用:还原特殊符号自身的含义

[root@xuegod140 ~]# echo $VAR1
xuegod
[root@xuegod140 ~]# echo $VAR1
$VAR1

4、单引号和双引号的区别
单引号括起来的,不改变括起来的内容,直接输出
双引号括起来的,需要执行内容后,进行输入

[root@xuegod140 ~]# VAR1=xuegod
[root@xuegod140 ~]# VAR2=‘nihao $VAR1’ #直接将内容赋值给到变量
[root@xuegod140 ~]# echo $VAR2
nihao $VAR1
[root@xuegod140 ~]# VAR3=“nihao $VAR1” #调用变量的内容后在赋值给变量
[root@xuegod140 ~]# echo $VAR3
nihao xuegod

5、变量的分类
按照作用可以分为四类:
1)用户自定义变量
2)环境变量:主要保存的是和系统操作环境相关的数据
3)位置参数变量:用来向脚本当中传递参数或数据,变量名不能自定义,是固定的
4)预定义变量:bash中定义好的变量,变量名不能自定义,变量作用也是固定的。
按照作用域可以分为两类:
1)局部变量:是shell内部定义的,适用范围仅限于定义的程序,对其他程序不可见。包括:用户自定义变量、位置变量和定义变量
2)全局变量:也是环境变量,其值不随shell脚本的执行结束而消失
总结:
1)用户在当前终端自定义的变量,只在当前终端生效,关闭终端,自动删除;
2)用户在脚本外定义的局部变量,脚本内无法使用;
3)全局变量,不限制使用位置,脚本内外都可以使用

例1:查看所有全部变量
env:显示全局变量;set:显示全局和局部变量

[root@xuegod140 ~]# env
[root@xuegod140 ~]# set | grep VAR #全局和局部变量
VAR2=‘nihao $VAR’
VAR3=‘nihao xuegod’

例2:export 把局部变量转换成全局变量

[root@xuegod140 ~]# VAR1=123
[root@xuegod140 ~]# echo $VAR1
123
[root@xuegod140 ~]# vim a.sh
[root@xuegod140 ~]# cat a.sh
#!/bin/bash
echo $VAR1
[root@xuegod140 ~]# sh a.sh #局部变量,脚本内部无法使用
[root@xuegod140 ~]# export VAR2=456 #转换为全局变量
[root@xuegod140 ~]# vim a.sh
[root@xuegod140 ~]# cat a.sh
#!/bin/bash
echo $VAR2
[root@xuegod140 ~]# sh a.sh #可以有输出
456
注:转换后的全局变量,也只能在当前终端使用,重新打开一个终端,无法使用
如果需要变量永久生效,需要将变量写入到配置文件

例3:变量的配置文件
/etc/profile 系统全局环境和登录系统的一些配置
/etc/bashrc shell全局自定义配置文件,用于自定义shell
/root/.bashrc 用户自定义的bash
/root/.bash_profile 用户单独定义的全局环境变量
这个四个文件的加载先后顺序:从上倒下以此加载

例4:插入永久变量

[root@xuegod140 ~]# echo “VAR=xuegod” >> /etc/profile
[root@xuegod140 ~]# source /etc/profile
[root@xuegod140 ~]# echo $VAR
xuegod
[root@xuegod140 ~]# tty
/dev/pts/1

新打开窗口也可以执行这个变量

[root@xuegod140 ~]# echo $VAR
xuegod
[root@xuegod140 ~]# tty
/dev/pts/0

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

[root@xuegod140 opt]# ls
a.sh
[root@xuegod140 opt]# a.sh #无法直接执行
bash: a.sh: command not found…
[root@xuegod140 opt]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@xuegod140 opt]# PATH=/opt/:$PATH #将这个目录添加到PATH路径
[root@xuegod140 opt]# a.sh
-bash: /opt/a.sh: Permission denied
[root@xuegod140 opt]# chmod +x a.sh #增加执行权限
[root@xuegod140 opt]# a.sh #可以直接执行
hello world

7、shell位置变量
shell解释器在执行命令的时候,将命令行的第一个字符作为命令名,而其它字符作为参数
$0:获取当前脚本的文件名,包括脚本的路径,命令本身
n : 获 取 当 前 脚 本 的 第 n 个 参 数 , n = 1 , 2..... n 当 n 大 于 9 时 , 用 n:获取当前脚本的第n个参数,n=1,2.....n当n大于9时,用 nnn=1,2.....nn9{10}表示
例:

[root@xuegod140 opt]# vim print.sh
[root@xuegod140 opt]# cat print.sh
#!/bin/bash
echo “本shell脚本的文件名 $0”
echo “第一个位置参数 $1”
echo “第一个位置参数 $2”
echo “第一个位置参数 $3”
echo “第一个位置参数 $4”
[root@xuegod140 opt]# sh print.sh 11 22 33 44 55
本shell脚本的文件名 print.sh
第一个位置参数 11
第一个位置参数 22
第一个位置参数 33
第一个位置参数 44

注:一般使用在服务启动,参数传递

[root@xuegod140 opt]# ll /etc/init.d/network
-rwxr-xr-x. 1 root root 7293 Jan 3 2018 /etc/init.d/network

8、特殊变量
有一些变量在开始执行脚本时就会设定,且不能修改,我们不叫只读变量,而叫它特殊变量。这些变量当一执行程序就有了
$:以一个字符串显示所有向脚本传递的参数;如”$”用[“]括起来,以”$1 2...... 2 ...... 2......n”的形式
$#:传递到脚本的参数个数
$$:当前进行的PID号
$?:显示最后执行命令的退出状态,0表示没有错误;其它数值表示有错误
$!:后台运行的最后一个进程PID号
$@:对变量进行单个输出
例:

[root@xuegod140 opt]# vim special_variable.sh
[root@xuegod140 opt]# cat special_variable.sh
#!/bin/bash
echo “$* 表示这个程序的所有参数”
echo “$# 表示传递参数的个数”
echo “$$ 表示当前进程的PID号”
ls /opt/xxxx/
echo “$? 表示上一个进程退出的状态”
tail -1 /etc/passwd &
echo “$! 表示后台最后一进程的PID号”
echo “$@ 对变量进行单个输入”
[root@xuegod140 opt]# sh special_variable.sh 11 22 33 44
11 22 33 44 表示这个程序的所有参数
4 表示传递参数的个数
2407 表示当前进程的PID号
ls: cannot access /opt/xxxx/: No such file or directory
2 表示上一个进程退出的状态
apache❌48:48:Apache:/usr/share/httpd:/sbin/nologin
2566 表示最后一进程的PID号
11 22 33 44 对变量进行单个输入

三、数学运算
1、expr 命令
对数字进行基本的计算
做数字大小比较时,输出结果假为0;真为1;特殊符号需要转移
例1:

[root@xuegod140 ~]# expr 2 > 5
0
[root@xuegod140 ~]# expr 2 < 5
1
[root@xuegod140 ~]# expr 2 * 5
10
[root@xuegod140 ~]# expr 4 / 2
2

例2:脚本中可以当做变量来赋值

[root@xuegod140 ~]# VAR=$(expr 3 + 5)
[root@xuegod140 ~]# echo $VAR
8
[root@xuegod140 ~]# vim expr.sh
[root@xuegod140 ~]# cat expr.sh
#!/bin/bash
#VAR=$(expr $1 + $2) #第一种方法,$()执行里面的命令后赋值到给变量VAR
VAR=`expr $1 + $2` #第二种方法,``执行里面的命令后赋值给到变量VAR
echo “The result is $VAR”
[root@xuegod140 ~]# sh expr.sh 11 22
The result is 33
[root@xuegod140 ~]# sh expr.sh 33 44
The result is 77

例3:对字符串的处理

[root@xuegod140 ~]# expr length “xuegod1903” #计算字符串的床都
10
[root@xuegod140 ~]# expr substr “xuegod1903” 3 3 #从第三个往后打印三个字符
ego
[root@xuegod140 ~]# expr substr “xuegod1903” 4 3 #从第四个往后打印三个字符
god

2、(())的使用
格式:((表达式1 表达式2))
特点:
1)在双括号中,所有表达式都可以像c语言一样,如:a++,b–等。a++等价于a=a+1
2)在双括号中,所有的变量都可以不加$前缀
3)双括号可以进行逻辑运算、四则运算
4)双括号支持for,while,if条件测试运算
5)支持多个表达式运算,各个表达式之间用”,”分开

常用的算术运算符
+ + - - :递增及递减,可以前置也可以后置
+ - ! ~ :一元运算的正负号 逻辑与取反
+ - * / % :加减乘除与余数
< <= > >= :比较大小的符号
== != :相等 不相等
>> << :向左位移 向右位移
&^ | :位的与 位的异或 位的或
&& || :逻辑与 逻辑或
? : :条件判断
例1:加减乘除

[root@xuegod140 ~]# a=10;VAR=$(a+2*3-5) #变量a无法调用值,但括号无法进行运算
bash: a+2*3-5: command not found…
[root@xuegod140 ~]# a=10;VAR=$((a+2*3-5)) #双括号调用变量不加$前缀,直接运算
[root@xuegod140 ~]# echo $VAR
11

例2:递增

[root@xuegod140 ~]# a=1
[root@xuegod140 ~]# echo $((a++)) #执行完后a=2
1
[root@xuegod140 ~]# echo $((a++)) #执行完后a=3
2
[root@xuegod140 ~]# echo $a
3
[root@xuegod140 ~]# echo $((a++)) #执行完后a=4
3
[root@xuegod140 ~]# a=10
[root@xuegod140 ~]# echo $((++a)) #a=11
11
[root@xuegod140 ~]# echo $a
11
[root@xuegod140 ~]# echo $((++a)) #a=12
12
[root@xuegod140 ~]# echo $((++a)) a=13
13
注:a++表示先赋值,后运算,然后把结果赋值到变量;
++a表示先运算,后赋值,然后把结果赋值到变量

例3:递减

[root@xuegod140 ~]# a=10
[root@xuegod140 ~]# echo $((a–))
10
[root@xuegod140 ~]# echo $((a–))
9
[root@xuegod140 ~]# echo $a
8
[root@xuegod140 ~]# echo $((–a))
7
[root@xuegod140 ~]# echo $((–a))
6
[root@xuegod140 ~]# echo $a
6
注:a–和--a同++a和a++意思相同
例4:数字大小比较
[root@xuegod140 ~]# expr 3 > 6
0
[root@xuegod140 ~]# echo $((3 > 6))
-bash: 3 > 6: syntax error: invalid arithmetic operator (error token is “> 6”)
[root@xuegod140 ~]# echo $((3 > 6)) #不需要使用转义符
0
[root@xuegod140 ~]# echo $((100*(1+100)/2)) #计算1加到100的和
5050

例5:方括号运算

[root@xuegod140 ~]# echo $[1+2]
3
[root@xuegod140 ~]# echo $[1*2]
2
[root@xuegod140 ~]# echo $[1/2] #直接整数运算,浮点数不支持(小数)
0

例6:浮点运算
bc 命令 Linux计算器

[root@xuegod140 ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty’.
5/2
2
scale=2 #显示小数点后两位
5/2
2.50
var=2
var1=3
var*var1 #支持变量运算
6

例7:在脚本中使用bc

[root@xuegod140 ~]# vim bc.sh
[root@xuegod140 ~]# cat bc.sh
#!/bin/bash
VAR1=$(echo “scale=4;12.5 / 7” | bc)
echo “This is $VAR1”
[root@xuegod140 ~]# sh bc.sh
This is 1.7857

例8:脚本中运算
let (())

[root@xuegod140 ~]# vim let.sh
[root@xuegod140 ~]# cat let.sh
#!/bin/bash
num=10
let num=$num+6
echo “This is $num”
[root@xuegod140 ~]# sh let.sh
This is 16
[root@xuegod140 ~]# b=10
[root@xuegod140 ~]# let b+=10;echo $b
20
[root@xuegod140 ~]# let b+=10;echo $b
30
[root@xuegod140 ~]# let b+=10;echo $b
40
[root@xuegod140 ~]# let b-=10;echo $b
30
[root@xuegod140 ~]# let b-=10;echo $b
20
[root@xuegod140 ~]# let b-=10;echo $b
10

四、实战-升级系统中java版本到1.8版本-为后期安装Hadoop集群做准备
下载最新的java包,进行安装

[root@xuegod140 opt]# ls
jdk-8u211-linux-x64.rpm
[root@xuegod140 opt]# rpm -ivh jdk-8u211-linux-x64.rpm
warning: jdk-8u211-linux-x64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing… ################################# [100%]
Updating / installing…
1:jdk1.8-2000:1.8.0_211-fcs ################################# [100%]
Unpacking JAR files…
tools.jar…
plugin.jar…
javaws.jar…
deploy.jar…
rt.jar…
jsse.jar…
charsets.jar…
localedata.jar…
[root@xuegod140 opt]# echo $?
0
[root@xuegod140 opt]# rpm -pql jdk-8u211-linux-x64.rpm #查看安装路径
[root@xuegod140 opt]# vim /etc/profile #修改配置文件
[root@xuegod140 opt]# tail -4 /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_211-amd64 #增加java的家目录
export JAVA_BIN=KaTeX parse error: Expected 'EOF', got '#' at position 18: …AVA_HOME}/bin #̲增加java的启动目录 exp…{JAVA_BIN}:KaTeX parse error: Expected 'EOF', got '#' at position 9: PATH #̲将启动目录加到PATH变量中 …{JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
[root@xuegod140 opt]# source /etc/profile #刷新配置文件

验证是否成功:

[root@xuegod140 opt]# java -version
java version “1.8.0_211”
Java™ SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot™ 64-Bit Server VM (build 25.211-b12, mixed mode)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值