第19节 shell基础
本节所讲内容:
19.1 shell 基本语法
终于在前面的章节把centos7基础介绍完成了,余下的几个章节都围绕这几个方面去介绍。
关于shell及脚本,通过工作中的实际应用总结以下几点,请大家斧正:
1、脚本很重要,特别是在linux自动化运维方面
2、脚本要多多练习,最少能读懂。建议是把别人脚本修改成自己的。
3、正则表达式一定要静下心来好好学学
4、三剑客“grep awk sed”一定要熟练掌握
19.1.1 什么是shell
shell:跟它的英文单词的意思一样,是命令解释器,工作在用户与内核之间的命令解释翻译功能
计算机懂什么语言?二进制语言
人类懂什么语言?符号语言
在计算机与人类之间的沟通就需要一个翻译了,这个就是shell横空出现的原因了
通过前面的章节大家知道系统的灵魂是内核,如果每个用户都能去直接操作内核的话,我相信任何一个系统都如玻璃般脆
应用程序-->shell-->内核-->硬件
人类的命令-->键盘输入-->shell-->二进制命令-->内核 输入执行命令的过程
显示命令结果<--显示器显示<--shell<--二进制结果<--内核 输出命令结果的过程
19.1.2 有哪些shell
[root@node-1 ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
常用的是/bin/bash
所在脚本第一行就是:#!/bin/bash 这句话的意思是调用这个shell作为命令解释器
19.2 SHELL变量及运用
19.2.1编写脚本的流程:
1)创建目录,集中存放脚本文件;
2)编写脚本内容;
vi 脚本名.sh ##编辑脚本文件
#!/bin/bash ##声明解释器
#注释内容 ##可以注释些信息,方便后续查看
命令及控制语句 ##脚本的核心内容
:wq ##保存文件
3)赋予脚本文件执行权限:chmod +x 脚本名.sh
4)运行脚本 脚本名.sh;
注意事项:
脚本中的路径建议用绝对路径
例1:牛刀小试一把
[root@node-1 ~]# mkdir /root/bash
[root@node-1 ~]# vim /root/bash/test1.sh
[root@node-1 ~]# cat /root/bash/test1.sh
#this is a test
#!/bin/bash
echo "Nice to meet you!"
mkdir /tmp/aa
touch /tmp/aa/aa.txt
[root@node-1 ~]# chmod +x /root/bash/test1.sh
[root@node-1 ~]# /root/bash/test1.sh
Nice to meet you!

[root@node-1 ~]# ll /tmp/aa /tmp
/tmp:
total 0
drwxr-xr-x 2 root root 19 Mar 10 10:41 aa

/tmp/aa:
total 0
-rw-r--r-- 1 root root 0 Mar 10 10:41 aa.txt
19.2.2 echo命令:返回结果并显示--输入即输出;
语法:echo [选项] "需要返回的值"
选项: 选项-e 若出现特殊字符则不将其转义,当普通字符对待;
在返回值中\n 代表强制换行、\t代表制表符;
内容中的选项:"内容\t内容" 插入tab
"内容\n内容" 强制换行
[root@node-1 ~]# echo -e "my name is \t tom"
my name is tom
[root@node-1 ~]# echo -e "my name is \n tom"
my name is
tom
19.2.3 脚本中的变量的应用;
1.概述:变量是一个筐,筐里装的是变量的值,只需要将筐带走,那么值也就随之带走,值为可变;
[root@node-1 ~]# NAME="tom"
[root@node-1 ~]# echo $NAME
tom
[root@node-1 ~]# NAME="TOM"
[root@node-1 ~]# echo $NAME
TOM
2.优点:简化输入,使脚本内容更加清晰,提高脚本的适用性;
3.分类:自定义变量、环境变量、位置变量、预定义变量;
4.自定义变量的定义:
a.定义变量:变量名=变量值
b.查看变量:echo $变量名
c.使用变量:在命令中直接使用 $变量名
d.取消变量:unset 变量名
e.变量的作用范围:
局部变量:变量名=变量值,此种变量只能在当前bash中有效;
全局变量:export 变量名=变量值,此种变量在当前bash和当前子bash中有效;
注:可用 bash命令开启当前进程的子进程bash,exit退回到父bash进程;
f.变量值中使用的括号:
"" :弱引用,会将双引号内的特殊符号与命令一起执行
[root@node-1 ~]# A="give me $5" --无转义字符
[root@node-1 ~]# echo $A
give me
[root@node-1 ~]# A="give me \$5" --双引号
[root@node-1 ~]# echo $A
give me $5
'' :强引用,会将单引号内的$、"、\等特殊符号失效,全部当成普通字符;
[root@node-1 ~]# A='give me \$5' --单引号
[root@node-1 ~]# echo $A
give me \$5
` :在定义变量时,引用命令,在值中引用变量等同于$(),''不可嵌套,$()可以嵌套;
[root@node-1 ~]# DuEtc=
du -sh /etc/` && echo $DuEtc
35M /etc/
$():在定义变量时,引用命令,可以嵌套;例:AC=$(rpm -qf $(which rz))
[root@node-1 ~]# QfNtp=$(rpm -qf $(which ntpdate))
[root@node-1 ~]# echo $QfNtp
ntpdate-4.2.6p5-28.el7.centos.x86_64
注:当变量值中包含'单引号时,应使用\'将单引号进行转义;
g.变量名不能使用特殊符号,一般用大写字母和下划线;
19.2.3 预定义变量:用户只能使用,不能创建,不能直接赋值;
$0:为脚本本身的名称
$:为脚本后的所有参数
$#:脚本参数个数
$?:上一条命令是否执行成功,返回值为0则成功,非0为失败
[root@node-1 ~]# vim /root/bash/print.sh
[root@node-1 ~]# chmod +x /root/bash/print.sh
[root@node-1 ~]# /root/bash/print.sh aa bb
本shell脚本的文件名: /root/bash/print.sh
参数个数: 2
参数有哪些: aa bb
是否执行成功: 0
第1个参数: aa
第2个参数: bb
[root@node-1 ~]# cat /root/bash/print.sh
#!/bin/bash
echo "本shell脚本的文件名: $0"
echo "参数个数: $#"
echo "参数有哪些: $
"
echo "是否执行成功: $?"
echo "第1个参数: $1"
echo "第2个参数: $2"
19.2.4 环境变量的定义:
1)环境变量设置用户工作环境,名称不能修改,值可以修改;
2)环境变量的常用:
PATH=设置外部命令的存放的路径,用冒号隔开
TMOUT=设置登录超时,单位为秒
HISTSIZE=设置历史命令记录的条数
LANG=设置语言环境(vi /etc/sysconfig/i18n 进行永久修改字符集)
注:设置临时环境变量时(注销就失效了):export PATH=
3)环境变量的查看:
env命令查看当前工作环境的所有环境变量
/etc/profile 、/etc/bashrc文件为用户每次登陆执行的的配置文件;
/root/.bash_profile、/root/.bashrc 每个root独立的环境变量配置文件;其他用户也是存在的,在安装oracle时需要对oracle用户相关环境变量进行修改
19.3 实战-安装可升级的java环境-为后期安装Hadoop集群做准备
1) 上传不同版本的jdk软件包到/usr/local/src目录下
[root@node-1 src]# ll
total 326364
-rw-r--r-- 1 root root 142376665 Aug 11 2014 jdk-7u67-linux-x64.tar.gz
-rw-r--r-- 1 root root 191817140 May 3 2019 jdk-8u201-linux-x64.tar.gz
2)安装命令
[root@node-1 src]# tar -zxf jdk-7u67-linux-x64.tar.gz
[root@node-1 src]# mv jdk
jdk1.7.0_67/ jdk-7u67-linux-x64.tar.gz jdk-8u201-linux-x64.tar.gz
[root@node-1 src]# mv jdk1.7.0_67/ /usr/local/
[root@node-1 local]# ln -s jdk1.7.0_67/ jdk
[root@node-1 local]# ll
total 4
drwxr-xr-x. 2 root root 6 Apr 11 2018 bin
drwxr-xr-x. 2 root root 6 Apr 11 2018 etc
drwxr-xr-x. 2 root root 6 Apr 11 2018 games
drwxr-xr-x. 2 root root 6 Apr 11 2018 include
lrwxrwxrwx 1 root root 12 Mar 10 11:25 jdk -> jdk1.7.0_67/
drwxr-xr-x 8 10 143 4096 Jul 26 2014 jdk1.7.0_67
.......
3)配置Java环境变量/etc/profile在最后一行添加以下三行
export JAVA_HOME=/usr/local/jdk/
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
[root@node-1 local]# source /etc/profile
4)验证环境变量
[root@node-1 local]# java -version
java version "1.7.0_67"
Java(TM) SE Runtime Environment (build 1.7.0_67-b01)
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)
5)升级java环境
[root@node-1 local]# cd /usr/local/src
[root@node-1 src]# tar -zxf jdk-8u201-linux-x64.tar.gz
[root@node-1 src]# mv jdk1.8.0_201/ /usr/local/
[root@node-1 src]# cd /usr/local/
[root@node-1 local]# ln -snf jdk1.8.0_201 jdk
[root@node-1 local]# ll
total 8
drwxr-xr-x. 2 root root 6 Apr 11 2018 bin
drwxr-xr-x. 2 root root 6 Apr 11 2018 etc
drwxr-xr-x. 2 root root 6 Apr 11 2018 games
drwxr-xr-x. 2 root root 6 Apr 11 2018 include
lrwxrwxrwx 1 root root 12 Mar 10 11:32 jdk -> jdk1.8.0_201
drwxr-xr-x 8 10 143 4096 Jul 26 2014 jdk1.7.0_67
drwxr-xr-x 7 10 143 4096 Dec 16 2018 jdk1.8.0_201
.......
[root@node-1 local]# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
无缝升级成功,其他软件版本也可以这样来处理如:nginx等