shell编程:
shell是一个由c语言编写的,既是一种语言又是一种命令。是用户和linux沟通的桥梁,shell脚本是一种为shell编写的脚本程序,他可以理解为一个可执行的命令的集合。
shell解释器
shell编程和java、php一样,只需要一个文本编辑器和一个解释工具即可。
常见的shell比较多:
bourne sh : /bin/sh
bourne again sh : bash :linux上默认的shell,/bin/bash
c shell :usr/bin/csh
k shell : usr/bin/ksh
shell for root : /sbin/sh
linux系统自带前3种shell
脚本写法&测试如下:
------------------------------------------------------
shell变量
分为系统变量和自定义变量
系统变量
set
自定义变量
int i = 1;
高级语言才是强类型的语言,编译型的语言都是弱类型的,不需要定义类型
变量以及作用域
总结:
1、a.sh中直接调用b.sh,会让b.sh在a所在的执行空间中开辟一个子空间来执行脚本
2、而子空间只能访问父进程中用export定义的变量(用了export相当于提升到了全局的变量)
3、一个shell进程无法将自己定义的变量提升到父进程空间
4、.号执行脚本时,会让脚本在调用者所在的shell进程空间中执行
规则:不能使用数字开头、首字母不要使用bash的关键字
引号的使用
hello worlds is best
a="hello world"
echo '$as is best'
双引号和单引号的区别
双引号仅将空格转义
单引号会将变量引用脱意
表达式赋值
$(()) 只负责计算
$[]
let 直接赋值
流程控制语句if
if [ $year -gt 1 ]; then echo "$year 年"; let year--; fi
判断条件
条件两边一定要带空格(没有空格就会被当成赋值)
只要是非空则返回true,否则返回false
注意[]内部=两边的空格
短路(三元运算符)
[ condition ] && echo ok || echo nook
条件满足,执行&&之后的语句,不满足,则执行||之后的语句
[] 的区别 [[]]
[] 里面使用 -a -o
[[]]里面使用&& ||
if [ a = b && b = c ] ;then echo ok;else echo "nook";fi
if [[ a = b && b = c ]] ;then echo ok;else echo "nook";fi
if [ a = a -a b = b ] ;then echo ok;else echo "nook";fi
if [[ a = a || b = c ]] ;then echo ok;else echo "nook";fi
循环、case
函数的简单案例
函数
语法:
[function] 函数名称[()]
{
action;
[return int;] //0-255之间
}
调用方式
function start()
function start
start 1 2 1 3
函数的参数、跨脚本调用
注意:
1、声明shell的函数,必须在调用函数之前进行声明。因为shell脚本是逐行调用的。
2、函数的返回值,只能通过$?系统变量来获取,可以显式的定义返回值:return int;如果不加return,将以最后一条命令运行结果,作为返回值。return的范围(0-255)
脚本调试:
sh -vx myfunction.sh (加上-vx)
在脚本中加 set -x (首行)
函数参数
注意:$10不能表示第十个参数,要获得第十个参数必须使用${10}。当n>=10时,需要使用${n}来获取参数。
函数返回值:
通过$?来获取函数的返回值
跨脚本调用函数:
. function.sh
或者 source function.sh
直接suorce下,在哪个地方都能使用
先配置一个文件服务器,将所有的软件(如mysql、httpd、jdk等)放到文件服务器上,批量安装,必须要有一个启动的脚本,要在一台机器上启动脚本
但是安装的话,则必须要在每台机器上还需要有一个安装脚本,所以要一个启动脚本boot.sh是用来启动任务的,且在boot.sh里面将install.sh脚本下发到各个节点,然后在启动各个install.sh(先下发,再启动),install.sh里面则是先下载安装包,然后安装配置jdk
测试expect的使用
可以用expect这个函数进行捕获终端的输出,
##!/bin/bash/expect
## exp_test.sh
set timeout -1; ###-1是超时,执行失败
spawn ssh hadoop0002; ###启动监控ssh的操作 spawn (监控)
expect {
"(yes/no)" {send "yes\r";exp_continue;} ##监控输出,如果出现了yes/no的提示,则发送一个yes回车
"password:" {send "123456\r";exp_continue;}##监控password关键字
eof {exit 0;}##遇到 eof结束符,退出
}
发送完一次后会继续监控直到没有输出为止
将需要的版本的jdk上传到创建的目录中
作业:
1、机器配置在脚本中,需要改进。可以配置在文件中
2、将ssh免密配置完整的在脚本中实现(需要可重复执行),免密需要主机与主机之间相互。
3、去掉输出内容
4、并行执行