shell 脚本:通常指的是在linux版本服务器中编写的脚本。shell 脚本本看成用户和系统之间的沟通桥梁。
shell属于解释型语言。
解释器类型有:
/bin/sh
/bin/bash
/bin/ksh
/bin/csh
等。
常用和绝大多数linux内核系统默认使用bash
shell脚本运行方式:
1、授予脚本可执行的权限
chmod a+x ./first.sh : 授予可执行权限
./first.sh : 执行./first.sh脚本
2、使用解释器执行:
bash ./first.sh : 使用bash解释执行
sh ./first.sh : 使用sh解释执行
===========shell中的变量
变量定义:
class=gp1813
注意:
1、变量名不能使用数字开头
2、=号的前后不能有空格
3、变量命令尽量不要使用关键字。(使用set或者help查看)
变量赋值:
class=corder
只读变量(不能再readonly之后重新赋值):
readonly class
删除变量:
unset class
直接把该行删除
class或者
c
l
a
s
s
或
者
classclass,
c
l
a
s
s
c
l
a
s
s
,
变量类型:
局部变量:脚本某个或者的英文脚本中某个方法中的变量
环境变量:配置到全局环境变量配置文件或者是个人的环境变量配置文件中
字符串:shell中一个弱类型的语言,变量都值的类型几乎都是字符串。
字符串拼接:
echo $ {class} class
“”,”, :反引号中的内容是可执行的Linux的命令反引号有的时候可以使用。{} 类类’ 回声“$ {类}类的 回声 :该句和下一句是等价的 echo $(日期)三者符号的区别:
(())来替代echo“
(
(
)
)
来
替
代
e
c
h
o
“
"" : 双引号中的取值符号或者是其它转义符都能被识别
'' : 单引号中的所有的字符串将会被原样输出
date
获取字符串的长度:
echo“class variable length:”$ {#class}
字符串的截取:
echo $ {class:2:3}:从2角标开始,截取3个长度。角标从0开始
shell中的
数组:和c中的数组差不多一样,暂不支持二维数组,数组下标都是从0开始。
数组定义:
arr1 =(1 2 3 4 5 6 9)
arr2 =(
1
3
5
7
9
)
arr3 [0] = 2
arr3 [2] = 5
arr3 [4] = 666
数组赋值:
arr1 [0] = 100
arr2 [0] = 1000
arr3 [0] = 10000
取单个值和所有值:
echo arr2 echo {arr2 [*]}, {arr3 [4]}:取单个值一个[R [R 3 é Ç ħ ö
arr1echo
a
r
r
1
e
c
h
o
arr3echo
a
r
r
3
e
c
h
o
arr2[@]echo
a
r
r
2
[
@
]
e
c
h
o
取的长度:
echo {#arr3 [*]},$ {arr3 [100]}当下标越界时不报异常{#arr3},
{#arr3},
shell中的注释:
除脚本中的第一行#!/bin/bash等指定解释器语句外的几乎所有#都是注释。
单行注释:一个#
多行注释:每一行加#或者使用方法封装需要注释的行,并且不调用该方法即可
shell中的运算:
数学运算
+ - * / %
echo “
1+
1
+
2”=expr $1 + $2
echo “
1−
1
−
2”=expr $1 - $2
echo “
1∗
1
∗
2”=expr $1 * $2
echo “
1/
1
/
2”=expr $1 / $2
echo “
1
1
2”=expr $1 % $2
echo “
1+
1
+
2”=
((
(
(
1+
2))echo“
2
)
)
e
c
h
o
“
1-
2”=
2
”
=
((
1−
1
−
2))
echo “
1∗
1
∗
2”=
((
(
(
1*
2))echo“
2
)
)
e
c
h
o
“
1/
2”=
2
”
=
((
1/
1
/
2))
echo “
1
1
2”=
((
(
(
1%$2))
运行脚本:
./math.sh 200 10
注意:
expr 是一个计算器工具命令,需要使用“ ,还需要注意空格
可以使用$(())来进行数学计算
关系运算
-eq -lt -le -ge -gt -ne = < <= >= > !=
a=10
b=6
if [
a−gt
a
−
g
t
b ]
then
echo “
a>
a
>
b”
fi
if [
a−eq
a
−
e
q
b ]
then
echo “
a=
a
=
b”
fi
fi
if [
a−le
a
−
l
e
b ]
then
echo “
a<=
a
<=
b”
fi
if [
a−ne
a
−
n
e
b ]
then
echo “
a!=
a
!
=
b”
fi
if ((
a>
a
>
b))
then
echo “
a>
a
>
b”
fi
字符运算
!=
-z : 为0返回true,否则false
-n : 不为0返回true
str : 不为0返回true
file=/home/shell/math.sh
if [ -z
file]thenecho“
f
i
l
e
]
t
h
e
n
e
c
h
o
“
file is null”
else
echo “$file is not null”
fi
if [ -n
file]thenecho“
f
i
l
e
]
t
h
e
n
e
c
h
o
“
file is not null”
else
echo “$file is null”
fi
if [
file]thenecho“
f
i
l
e
]
t
h
e
n
e
c
h
o
“
file is not null”
else
echo “$file is null”
fi
文件运算:
-d: 是否是目录
-f: 是否是文件
-r:
-w:
-x:
-e: 文件或者目录是否存在
-s: 大小是否为0,不为0返回true
filepath=/home/shell/math.sh
if [ -f
filepath]thenecho“
f
i
l
e
p
a
t
h
]
t
h
e
n
e
c
h
o
“
filepath is file”
fi
if [ -e
filepath]thenecho“
f
i
l
e
p
a
t
h
]
t
h
e
n
e
c
h
o
“
filepath is exists”
fi
if [ -x
filepath]thenecho“
f
i
l
e
p
a
t
h
]
t
h
e
n
e
c
h
o
“
filepath is execute”
fi
if [ -s
filepath]thenecho“
f
i
l
e
p
a
t
h
]
t
h
e
n
e
c
h
o
“
filepath length is not 0”
fi
布尔运算
!
-a : 逻辑与&&
-o : 逻辑或||
逻辑运算:&& || ,如果需要使用这种数学中的这种符号,需要使用双中括号或者圆括号。
if [[
1−gt
1
−
g
t
2 ||
1−eq
1
−
e
q
2 ]]
then
echo “
1>=
1
>=
2”
fi
if [[
1−gt
1
−
g
t
2 -o
1−eq
1
−
e
q
2 ]]
then
echo “
1>=
1
>=
2”
fi
三元运算符:
[条件] && cmd1 || cmd2 条件满足,执行cmd1,不满足cmd2
[ 1 = 1 ] && echo “1=1” || echo “1!=1”
控制条件:
if []
then
cmd1
fi
if []
then
cmd1
else
cmd2
fi
if []
then
cmd1
elif []
then
cmd2
else
fi
if [];then cmd1;fi 写成一行
注意:
if后面需要有then
没有elseif,只有elif
每一个if都需要有fi结束
每一个控制体中都必须要有语句
if和[]中的空格需要严格注意。如果使用$(())可以不用注意空格
else后面不能跟then,否则报错
a=10
b=6
if [
a−gt
a
−
g
t
b ]
then
echo “
a>
a
>
b”
elif [
a−eq
a
−
e
q
b ]
then
echo “
a=
a
=
b”
else
echo “
a<
a
<
b”
fi
if((
a>
a
>
b))
then
echo “
a>
a
>
b”
fi
循环
for while until
for i in 循环体
do
cmd…
done
for i in 1 2 3 ; do echo $i ; done
for i in seq 1 10
do
echo $i
done
basedir=/home/shell
for i in ls $basedir
do
echo
basedir/
b
a
s
e
d
i
r
/
i
done
while((循环体))
do
cmd…
done
i=0
while((
i<11))doecho
i
<
11
)
)
d
o
e
c
h
o
i
i=expr $i + 1
let “i++”
done
i=0
while: 死循环
do
echo $i
i=expr $i + 1
let “i++”
done
until 循环体
do
cmd…
done
echo “until===============”
j=0
until [
j>10]doecho
j
>
10
]
d
o
e
c
h
o
j
done
./for.sh -m fas -n 12 -d 2018-09-10
./for.sh -m fas -n 12 -d
./for -d 2018-09-10
date=
unitl [ # -eq 0 ]
do
if [
# -eq 0 ] do if [
1’x’ = ‘-dx’ ]
then
shift
date=
1fishiftdoneecho
1
f
i
s
h
i
f
t
d
o
n
e
e
c
h
o
date
shell中支持case In模式匹配,类似switch case
case 值 in
模式1)
cmd…
;;
模式2)
cmd…
;;
esac
shell中也支持continue和break
例子:
while:
do
echo “请输入一个1-10的数字:”
read num
case
numin1|2|3|4|5|6|7|8|9|10)echo“你输入的数字
n
u
m
i
n
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
)
e
c
h
o
“
你
输
入
的
数
字
num在1-10之间.”
break
;;
*)
echo “你输入的数字$num不在1-10之间.清继续输入:”
continue
;;
esac
done
shell中的方法
[function] 方法名(){
方法体
}
无参数无返回值方法:
function fun1(){
echo“我在函数fun1。”
}
echo“在函数调用之前。”
fun1
echo“在函数调用之后”。
带参数无返回值:
function fun2(){
echo“sum is:” 1 + $ 2)) }
((
(
(
带参数,带返回值:
function fun3(){
echo“第1个参数: 2” echo“第9个参数: 10” echo“第10个参数: *“ echo”所有参数个数:(( 2)) }
1”echo“第2个参数:
1
”
e
c
h
o
“
第
2
个
参
数
:
9”echo“第10个参数:
9
”
e
c
h
o
“
第
10
个
参
数
:
10”echo“所有参数:
10
”
e
c
h
o
“
所
有
参
数
:
#”
return
#” return
1+
1
+
# :取参数的个数
# :取参数的个数
*:取所有参数?:取回返值。只能返回方法的退出代码(0-255之间) 1-9:取第几个参数 $ {10}:取第10个及以上的参数
@:取所有参数
@
:
取
所
有
参
数
0:取运行当前脚本
0
:
取
运
行
当
前
脚
本
* :所有参数的英文一个字符串,即一个元型态素 ” 1 2 3 ”
∗和
∗
和
@的区别:
不加“”取值都一样,可以将所有的值作为一个参数列表
加“”取值时: @:所有参数分别是多个字符,即可以做一个参数列表“1”“2”“3”
∗:所有参数是一个字符串,即一个元素”123”
∗
:
所
有
参
数
是
一
个
字
符
串
,
即
一
个
元
素
”
1
2
3
”
shell中的问价的引入:
source文件的绝对路径
。文件的绝对路径
shell中的调试:
sh -n ./for.sh:检测for.sh语法是否有问题
sh -x ./for.sh:查看for.sh的运行详细情况
sh -x ./for.sh:按ctrl + z退出程序,然后分别按fg键(f键和g键)继续调试
断点调试:借助第三方的调试工具bashdb进行断掉调试
断点调试代码(test.sh):
!/斌/庆典
i = 0
而((i <3))
do
date = date -d "$i days ago" "+%Y-%m-%d"
i = expr $i + 1
echo $ date
done
bashdb -debugger ./test.sh:断点调试命令
bashdb的命令:
l:列出10行代码
n:执行下语句
c 5:一直运行n行
s 5:单步运行多少次
b 5:在5行打断点
del 5:删除5行的断点
q :退出
R:重新断点
完成:直接完成
linux中的日期格式:
x:正数是多少单位以前,负数的时候多少单位以后
x小时前
x天前
x周前
x个月前
x年前
获取天:
获取时间戳:
回波date -d "1 hours ago" "+%Y-%m-%d %H:%M:%S"
的回波date -d "-1 hours ago" "+%Y-%m-%d %H:%M:%S"
的回波date -d "1 weeks ago" "+%Y-%m-%d"
的回波date -d "1 weeks ago" "+%d"
的回波date -d "1 weeks ago" "+%m"
的回波date -d "1 weeks ago" "+%s"
定时任务列表:
crontab -e:编辑当前用户的定时任务列表
crontab -e -u gj:-u指定编辑gj用户的定时任务列表
crontab -l:查看当前用户的定时任务列表
crontab -l -u gj:查看gj的定时任务列表
crontab -r:删除当前用户的定时任务列表
crontab -r -u gj:删除gj的定时任务列表(-i给出确认删除提示)
-
-
-
-
- 可执行的脚本或者可执行的命令信息处理分时
天月周
- 可执行的脚本或者可执行的命令信息处理分时
-
-
-
1,2,3 1-10 / 2
- :任意单位
* / n:每隔n个单位
1,2,3:在1,2,3单位
1-10:1到10的连续单位
1-10 / 2:1-10的连续单位每隔两个单位
30 02 * * * /home/my.sh >> /home/my.log
/ 1 * * * / bin / echo“hello gp1813”>> /home/my.log
/ 1 * * * / home / my。 sh >> /home/my.log
crontab -l -u root:为root创建定时任务列表
crontab -l -u root:查看root用户的定时任务列表
crontab -r -u root:删除root的定时任务列表
crontab -e -u gj:给gj创建定时任务列表
crontab -r -u gj:删除gj定时任务列表
快照:在某一时刻给系统拍一张照片(某时刻系统镜像)
克隆:一复制台状语从句:另一台机子一模一样的服务器
关键- >管理- >克隆- >下一步- >克隆当前状态- >创建完整克隆(修改名称和存储地方)
修改克隆机子的ip信息:
vi / etc / sysconfig / network-scripts / ifcfg-eth0修改eth0网卡信息
00:50:56:39:D8:A9
vi / etc / sysconfig / network修改的主机名
vi / etc / hosts:配置映射
17:59:01
Big-Data-Gp-13-张帅鹏2018/9/10 17:59:01
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
:: 1 localhost localhost.localdomain localhost6 localhost6。 LOCALDOMAIN
192.168.216.111 www.hadoop.com hadoop01
192.168.216.128 Ethan01
192.168.216.129 Ethan02
192.168.216.130 Ethan03
vi /etc/udev/rules.d/70-persistent-net
目的:
window能ping通克隆出来的每一台服务器
克隆出来的每一台机子和原来的需要能通信
00:0C:29:C9:6E:FD
作业:
案例1:面试题中的shell题
第一种方法:( rename一定需要走到当前目录,否则错误)
第二种方法:(注意发现不能用就换/ bin / sh的,注意执行脚本需要传参数)
第三种方法:(采用循环MV的方式来做??较为麻烦)
案例2 :(每天凌晨2点10分定时删除一周前的日志文件)
日志格式为:
2018-09-01.log
2018-09-02.log
2018-09-03.log
2018-09-04.log
2018-09-05.log
2018-09-06.log
2018-09-07.log
2018-09-08.log