本篇博客
1.函数
1.1 定义
1.2 函数调用
1.3 函数中的参数
1.4 返回值
1.5 练习
2.自动化部署实战
2.1 涉及知识点
2.2 部署前准备
2.3 部署
3 安装 Oracle(是2.3的实操)
1.函数
1.1 定义
定义:
函数名(){}
1.2 函数调用
调用:直接叫名字就可以了。
函数名
注意:必须先定义再调用
#!/bin/bash #先定义函数 hello(){ echo "helloworld" } #再调用函数 hello
执行,结果为:
1.3 函数中的参数
函数传参:用$n来接收传递的数据
#!/bin/bash #先定义函数 add(){ echo "这是第一个参数:$1" echo "这是第二个参数:$2" } #再调用函数 add 1 100
执行结果:
练习:输入任意两个整数进行求和运算,并打印结果
#!/bin/bash #先定义函数 add2(){ sum=$(($1+$2)) echo "结果为:$sum" } read -p "请输入第一个参数:" num1 read -p "请输入第二个参数:" num2 #再调用函数 add2 $num1 $num2
执行结果为:
1.4 返回值
返回值:函数中默认的存在返回值
正确时返回0
错误时返回1
查看返回值内容 :$?
正确的代码:
#!/bin/bash #先定义函数 hello(){ echo "helloworld" } #再调用函数 hello #查看函数的返回值 echo $?
执行结果为:函数返回值为:0
错误的代码:
#!/bin/bash #先定义函数 hello(){ echo "helloworld" cd klasjda } #再调用函数 hello #查看函数的返回值 echo $?
执行结果为:函数返回值是:1
1.5 练习
练习:输入一个目录,判断目录是否存在,如果不存在则给出提示,如果存在则提示输入要创建的文件名,判断创建的文件是否存在,如果不存在,则继续创建,否则提示该文件已经存在,用函数实现
比较复杂的函数:先用流程图理清思路。
代码如下:
#!/bin/bash createfilename(){ #进入目录 cd $1 #提示用户输入文件名 read -p "请输入文件名:" filename #判断文件是否存在 if [ -f "$filename" ] then echo "文件存在" else echo "文件正在创建" touch $filename echo "文件创建完成" fi } #提示用户输入目录 read -p "请输入目录:" dir if [ -d "$dir" ] then echo "目录存在" createfilename $dir else echo "目录不存在" fi
执行结果为:
2.自动化部署实战
2.1 涉及知识点
1.查看文件中的前n条数据:head -n
2.在文件中查看内容:grep "内容" 文件名
3.剪取文件中的内容:cut
4.向文件中插入内容:sed -i "行号a内容" 文件名向文件中插入内容
sed -i "行号a内容" 文件名 sed -i "行号i内容" 文件名
sed 用法示例:
在匹配行后面追加 a
passwd文件第10行后面追加"Add Line Behind"
sed -i '10aAdd Line Behind' passwd
passwd文件第10行到第20行,每一行后面都追加"Test Line Behind"
sed -i '10,20a Test Line Behind' passwd
在匹配行前面追加 i
passwd文件匹配到以nginx开头的行,在匹配行前面追加"Add Line Before"
sed -i '/^nginx/i Add Line Before' passwd
passwd文件每一行前面都追加"Insert Line Before Every Line"
sed -i 'a Insert Line Before Every Line' passwd
例: 新建一个test.txt 文件,并写一条记录aaaa
将aaaa全部替换成ssss,命令如下所示:
sed -i 's/aaaa/ssss/' test.txt
cut--->剪取
- 按照字节进行剪取
- 按照字符进行剪取
- 按照域进行进行剪取
1)按照字节进行剪取:-b表示
1个字母:1个字节
1个空格:1个字节
1个汉字:3个字节(下图可以看出:一个汉字三个字节)
举例:/etc/passwd文件
vim进入passwd文件
1)剪取1-4的字节
head -5 passwd|cut -b 1-4
注意:
- head -5 passwd :获取的是passwd文件的前5行
- |:管道符
- head -5 passwd|cut -b 1-4 :获取的是passwd文件前5行的1-4个字节
2)剪取第4个的字节
head -5 passwd|cut -b 4
3)剪取1-4的字节
head -5 passwd|cut -b -4
4)从第4个字节开始剪取
head -5 passwd|cut -b 4-
5)剪取1-2个字节以及第4个字节
head -5 passwd|cut -b 1-2,4
6)剪取的相同的内容会去重
pwd|cut -b -3,3-
2)按照字符进行剪取:-c表示
注意:一个汉字就是一个字符、一个空格就是一个字符
举例:
1)剪取前两个字符
pwd|cut -c 1-2
2)剪取第一个字符
pwd|cut -c 1
3)剪取第一个和第四个字符
pwd|cut -c 1,4
3)按照域进行进行剪取:
剪取的分隔符 -d
-f:取的域的位置
举例:按照冒号进行剪取,取第一个域
head -5 passwd|cut -d ":" -f 1
2.2 部署前准备
1.判断用户是否为root,流程图:
#!/bin/bash #判断当前用户是否是root-----$USER if [ "$USER" == "root" ] then echo "当前用户是root" else echo "当前用户不是root" fi
执行结果为:
2.创建管理组、安装组函数
1)创建管理组
新建管理组:groupadd dba
#!/bin/bash #定义创建组函数 creategrp(){ #创建管理组 groupadd dba } #判断当前用户是否是root-----$USER if [ "$USER" == "root" ] then echo "当前用户是root" #调用创建组函数 creategrp else echo "当前用户不是root" fi
因为:创建完成,要找到它,判断是否创建完成。
注意:创建关联组后,会在/etc/group文件有相关组内容。
vim group后可以看到有dba这行。
通过grep命令找到group文件中的"dba"内容。
grep "dba" /etc/group
判断管理组是否存在
#判断管理组是否存在 finddba=`grep "dba" /etc/group|cut -d ":" -f 1` if [ "$finddba" == "dba" ] then echo "管理组创建成功" else echo "管理组创建失败" fi
创建管理组完整的代码
#!/bin/bash #定义创建组函数 creategrp(){ #创建管理组 groupadd dba #判断管理组是否存在 finddba=`grep "dba" /etc/group|cut -d ":" -f 1` if [ "$finddba" == "dba" ] then echo "管理组创建成功" else echo "管理组创建失败" fi } #判断当前用户是否是root-----$USER if [ "$USER" == "root" ] then echo "当前用户是root" #调用创建组函数 creategrp else echo "当前用户不是root" fi
进入/etc/group目录下,把之前的dba那行数据给删除。
执行命令:sh oraclel.sh
2)创建安装组并判断创建安装组是否成功。
新建安装组:groupadd oinstall
#创建安装组 groupadd oinstall #判断安装组是否存在 findoin=`grep "oinstall" /etc/group|cut -d ":" -f 1` if [ "$findoin" == "oinstall" ] then echo "安装组创建成功"
else echo "安装组创建失败" fi
新建安装组完整的代码:
#!/bin/bash #定义创建组函数 creategrp(){ #创建管理组 groupadd dba #判断管理组是否存在 finddba=`grep "dba" /etc/group|cut -d ":" -f 1` if [ "$finddba" == "dba" ] then echo "管理组创建成功" #创建安装组 groupadd oinstall #判断安装组是否存在 findoin=`grep "oinstall" /etc/group|cut -d ":" -f 1` if [ "$findoin" == "oinstall" ] then echo "安装组创建成功"
else echo "安装组创建失败" fi else echo "管理组创建失败" fi } #判断当前用户是否是root-----$USER if [ "$USER" == "root" ] then echo "当前用户是root" #调用创建组函数 creategrp else echo "当前用户不是root" fi
3.创建tester用户函数。判断是否成功,成功后修改密码。
新建用户,用户录属于 dba 和 oinstall :useradd tester -g oinstall -G dba
修改用户密码:passwd tester
#定义创建用户函数 createuser(){ #创建用户 useradd tester -g oinstall -G dba #创建完成,会在/etc/passwd目录下 finduser=`grep "tester" /etc/passwd|cut -d ":" -f 1` #判断用户是否存在 if [ "$finduser" == "tester" ] then echo "用户$finduser创建成功"
#修改密码
passwd tester else echo "用户创建失败" fi } #调用创建用户函数 createuser
创建tester用户函数。判断是否成功,成功后修改密码的完整代码
#!/bin/bash #定义创建用户函数 createuser(){ #创建用户 useradd tester -g oinstall -G dba #创建完成,会在/etc/passwd目录下 finduser=`grep "tester" /etc/passwd|cut -d ":" -f 1` #判断用户是否存在 if [ "$finduser" == "tester" ] then echo "用户$finduser创建成功"
#修改密码
passwd tester
else echo "用户创建失败" fi } #定义创建组函数 creategrp(){ #创建管理组 groupadd dba #判断管理组是否存在 finddba=`grep "dba" /etc/group|cut -d ":" -f 1` if [ "$finddba" == "dba" ] then echo "管理组$finddba创建成功" #创建安装组 groupadd oinstall #判断安装组是否存在 findoin=`grep "oinstall" /etc/group|cut -d ":" -f 1` if [ "$findoin" == "oinstall" ] then echo "安装组$findoin创建成功" #调用创建用户函数 createuser else echo "安装组创建失败" fi else echo "管理组创建失败" fi } #判断当前用户是否是root-----$USER if [ "$USER" == "root" ] then echo "当前用户是root" #调用创建组函数 creategrp else echo "当前用户不是root" fi
把/etc/group:删除dba和oinstall行。
把/etc/passwd:删除tester行。
执行代码:
sh oraclel.sh
结果为:成功了,报了一个warring的错。后面再看看有什么影响。密码:123456
4.创建目录函数:修改 oracle 安装目录属主和属组,#修改 oracle 安装目录操作权限
新建 oracle 安装目录:mkdir -p /oracle/product/10.2.0/db_1
修改 oracle 安装目录属主和属组:chown -R tester.oinstall /oracle
修改 oracle 安装目录操作权限:chmod 755 -R /oracle
这里介绍一下:chmod和chown
修改权限-chmod
1. chmod指令:可以修改文件或者目录的权限
有两种方式修改权限
第一种方式:
(1)+ 、-、= 变更权限
u:所有者 g:所在组 o:其他组 a:所有人(u、g、o的总和)
所有者:
一般为文件的创建者,谁创建了该文件,就是天然的成为该文件的所有者。
ls -ahl 命令可以看到文件的所有者。
所在组
当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组。
但是,文件所在组不一定就是文件所有者的所在组。
① chmod u=rwx, g=rx, o=x 文件目录名
② chmod o+w 文件目录名 给其他组的用户增加写的权限
③ chmod a-x 文件目录名 给所有人去掉可执行文件的权限
案例:
1)给abc文件的所有者读写执行的权限,给所在组读执行权限,给其它组写执行权限
chmod u=rwx,g=rw,o=wx
2)给abc文件的所有者除去执行的权限,增加组写的权限
chmod u-x,g+w
3)给abc文件的所有用户添加读的权限
chmod a+r abc
(2)第二种方式:通过数字变更权限
r=4 w=2 x=1 rwx=4+2+1=7
chmod u=rwx,g=rx,o=x 文件目录名,和下面是等价的:
chmod 751 文件目录名
2. 修改文件所有者-chown
基本介绍 chown newowner file 改变文件的所有者
chown newowner:newgroup file 改变用户的所有者和所有组 -R
如果是目录 则使其下所有子文件或目录递归生效
案例:
(1) 请将 /home/abc .txt 文件的所有者修改成 tom
chown tom abc.txt
(2) 请将 /home/kkk 目录下所有的文件和目录的所有者都修改成tom
chown tom -R kkk/
(将kkk目录下所有的文件和文件夹的所有者全部修改为tom)
3. 修改文件所在组-chgrp
基本介绍 chgrp newgroup file 改变文件的所有组
案例:
1) 请将 /home/abc .txt 文件的所在组修改成 bandit
chgroup bandit /home/abc .txt
2) 请将 /home/kkk 目录下所有的文件和目录的所在组都修改成bandit
chgroup bandit -R /home/kkk/
ll:查看文件权限信息
d rwx rwx rwx =777 表示目录的操作权限
- rwx rwx rwx = 777 表示文件的操作权限
root :用户
root:组
4096文件的大小(字节)
Oct 17 09:50 最后修改文件的时间
api 文件名
从这里开始是函数:
#定义创建目录函数 createdir(){ mydir="/oracle/product/10.2.0/db_1" mkdir -p $mydir #判断 if [ -d "$mydir" ] then echo "$mydir目录创建成功" #修改 oracle 安装目录属主和属组 chown -R tester.oinstall /oracle #修改 oracle 安装目录操作权限 chmod 755 -R /oracle else echo "目录创建失败" fi } #调用创建目录函数 createdir
创建目录函数的代码:
#!/bin/bash #定义创建目录函数 createdir(){ mydir="/oracle/product/10.2.0/db_1" mkdir -p $mydir #判断 if [ -d "$mydir" ] then echo "$mydir目录创建成功" #可以把打印的内容重定向到文件中。 #修改 oracle 安装目录属主和属组 chown -R tester.oinstall /oracle #修改 oracle 安装目录操作权限 chmod 755 -R /oracle else echo "目录创建失败" fi } #定义创建用户函数 createuser(){ #创建用户 useradd tester -g oinstall -G dba #创建完成,会在/etc/passwd目录下 finduser=`grep "tester" /etc/passwd|cut -d ":" -f 1` #判断用户是否存在 if [ "$finduser" == "tester" ] then echo "用户$finduser创建成功" #修改密码 passwd tester #调用创建目录函数 createdir else echo "用户创建失败" fi } #定义创建组函数 creategrp(){ #创建管理组 groupadd dba #判断管理组是否存在 finddba=`grep "dba" /etc/group|cut -d ":" -f 1` if [ "$finddba" == "dba" ] then echo "管理组$finddba创建成功" #创建安装组 groupadd oinstall #判断安装组是否存在 findoin=`grep "oinstall" /etc/group|cut -d ":" -f 1` if [ "$findoin" == "oinstall" ] then echo "安装组$findoin创建成功" #调用创建用户函数 createuser else echo "安装组创建失败" fi else echo "管理组创建失败" fi } #判断当前用户是否是root-----$USER if [ "$USER" == "root" ] then echo "当前用户是root" #调用创建组函数 creategrp else echo "当前用户不是root" fi
5.创建了修改环境变量函数
1) 注销当前 root 用户(建议注销,不用 su 命令置换),再用刚才新建的 tester 用户登录 系统。进入当前用户的根目录执行命令[vi ./.bash_profile],打开用户环境变量列表,插入 如下内容:
ORACLE_BASE=/oracle ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1 ORACLE_SID=orcl PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib export ORACLE_BASE export ORACLE_HOME export ORACLE_SID export PATH export LD_LIBRARY_PATH
理解:第一步,进入当前用户的根目录执行命令[vi ./.bash_profile]
理解:第二步,打开用户环境变量列表,插入 如下内容
知识点1:向文件中插入内容
sed -i "行号a内容" 文件名
root账户,切换到:/home/tester路径下。修改.bash_profile文件。
知识点2:显示行号-----:set num(有一个英文冒号)
2) 进入文件后,单击[i],开始修改,修改完成后保存退出(ESC—冒号—wq),执行命 令[source ./.bash_profile],使修改生效,此时你可以利用命令[echo $ORACLE_BASE]或 [echo $PATH]命令查看刚才的设置内容,如下图所示:
打开用户环境变量列表,并使脚本生效。代码如下:
#创建环境变量配置函数 editenv(){ #进入tester的根目录下 cd /home/tester #向文件中插入内容 sed -i "10aORACLE_BASE=/oracle" .bash_profile sed -i '11aORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1' .bash_profile sed -i "12aORACLE_SID=orcl" .bash_profile sed -i '13aPATH=$PATH:$HOME/bin:$ORACLE_HOME/bin' .bash_profile sed -i '14aLD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib' .bash_profile sed -i "15aexport ORACLE_BASE" .bash_profile sed -i "16aexport ORACLE_HOME" .bash_profile sed -i "17aexport ORACLE_SID" .bash_profile sed -i "18aexport PATH" .bash_profile sed -i "19aexport LD_LIBRARY_PATH" .bash_profile #更新文件内容 source ./.bash_profile #判断 if [ "$ORACLE_BASE" == "/oracle" ] then echo "环境变量配置成功" else echo "环境变量配置失败" fi } editenv
部署前准备完整脚本 : oraclel.sh
#!/bin/bash #创建环境变量配置函数 editenv(){ #进入tester的根目录下 cd /home/tester #向文件中插入内容 sed -i "10aORACLE_BASE=/oracle" .bash_profile sed -i '11aORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1' .bash_profile sed -i "12aORACLE_SID=orcl" .bash_profile sed -i '13aPATH=$PATH:$HOME/bin:$ORACLE_HOME/bin' .bash_profile sed -i '14aLD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib' .bash_profile sed -i "15aexport ORACLE_BASE" .bash_profile sed -i "16aexport ORACLE_HOME" .bash_profile sed -i "17aexport ORACLE_SID" .bash_profile sed -i "18aexport PATH" .bash_profile sed -i "19aexport LD_LIBRARY_PATH" .bash_profile #更新文件内容 source ./.bash_profile #判断 if [ "$ORACLE_BASE" == "/oracle" ] then echo "环境变量配置成功" else echo "环境变量配置失败" fi } #定义创建目录函数 createdir(){ mydir="/oracle/product/10.2.0/db_1" mkdir -p $mydir #判断 if [ -d "$mydir" ] then echo "$mydir目录创建成功" #可以把打印的内容重定向到文件中。 #修改 oracle 安装目录属主和属组 chown -R tester.oinstall /oracle #修改 oracle 安装目录操作权限 chmod 755 -R /oracle #调用环境变量配置函数editenv editenv else echo "目录创建失败" fi } #定义创建用户函数 createuser(){ #创建用户 useradd tester -g oinstall -G dba #创建完成,会在/etc/passwd目录下 finduser=`grep "tester" /etc/passwd|cut -d ":" -f 1` #判断用户是否存在 if [ "$finduser" == "tester" ] then echo "用户$finduser创建成功" #修改密码 passwd tester #调用创建目录函数 createdir else echo "用户创建失败" fi } #定义创建组函数 creategrp(){ #创建管理组 groupadd dba #判断管理组是否存在 finddba=`grep "dba" /etc/group|cut -d ":" -f 1` if [ "$finddba" == "dba" ] then echo "管理组$finddba创建成功" #创建安装组 groupadd oinstall #判断安装组是否存在 findoin=`grep "oinstall" /etc/group|cut -d ":" -f 1` if [ "$findoin" == "oinstall" ] then echo "安装组$findoin创建成功" #调用创建用户函数 createuser else echo "安装组创建失败" fi else echo "管理组创建失败" fi } #判断当前用户是否是root-----$USER if [ "$USER" == "root" ] then echo "当前用户是root" #调用创建组函数 creategrp else echo "当前用户不是root" fi
删除
- 把/etc/group:删除dba和oinstall行。
- 把/etc/passwd:删除tester行。
- rm -rf oracle------cd /
执行结果:
验证: 添加完成
cd /home/tester
vim .bash_profile
2.3 部署
通过函数之间的相互调用实现(先脚本文件时,先流程图,再脚本)
1.判断用户是否为tester
2.创建了安装函数install(拷贝、解压、安装)
3 安装 Oracle
1、 注销系统,用 tester 用户登录系统(注意如果上一步没有注销,这一步一定要注销, 要是你当前桌面显示[tester 的主目录])。root用户下切换到tester用户下:
su tester #密码:123456
注意:(如果再从tester用户切换到root用户下:exit)
找到 Oracle 安装文件,比如我的是放在/tmp 下的 zip文件,所以首先解压缩。
unzip $my_file #解压文件
2、 解压缩完成,会生成一个 database 的文件夹,进入 database 目录下会看到一个可执 行文件 runInstaller,执行命令[./runInstaller ],安装开始。
./runInstaller #执行安装文件
3、 shell自动化部署脚本。
准备工作:在root用户下修改文件夹的权限。文件夹名称(比如说aaa):这里面是放之前的 oraclel.sh文件的。这个文件夹最好放在/(根目录下)
chmod 777 aaa
部署完整脚本:/aaa/oracle2.sh。shell自动化部署(拷贝,解压,安装)的脚本如下:这里是tester用户登陆
#!/bin/bash #定义函数 install(){ #进入tmp目录下 cd /tmp my_file="linuxamd64_12102_database_1of2.zip" if [ -f "$my_file" ] then echo "文件存在" else echo "文件不存在" echo "文件正在拷贝中...." cp /mnt/hgfs/唧唧下载视频/$my_file /tmp echo "文件拷贝成功" fi #解压 echo "文件正在解压中" unzip $my_file echo "文件解压成功" #判断解压文件是否存在 if [ -d "database" ] then echo "文件夹已经存在" #进入文件夹 cd database #执行安装文件 ./runInstaller else echo "文件解压失败" fi } if [ "$USER" == "tester" ] then echo "当前用户是tester" #调用install函数 install else echo "当前用户不是tester" fi
例:oracle2.sh脚本分步执行(拷贝,解压,执行)
在官网下载一个:linuxamd64_12102_database_1of2.zip文件
上传文件:winsows文件 (linuxamd64_12102_database_1of2.zip)上传文件到阿里云(centos服务器)上。在Mobaxterm软件操作即可。
1)执行拷贝:
拷贝完成:
2) 文件解压:好像不能瞎选。
解压完成:
3)安装文件,到这就行了。