shell知识点、基本语法

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 [ agt a − g t b ]
then
echo “ a> a > b”
fi
if [ aeq a − e q b ]
then
echo “ a= a = b”
fi
fi
if [ ale a − l e b ]
then
echo “ a<= a <= b”
fi
if [ ane 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 [[ 1gt 1 − g t 2 || 1eq 1 − e q 2 ]]
then
echo “ 1>= 1 >= 2”
fi

if [[ 1gt 1 − g t 2 -o 1eq 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 [ agt a − g t b ]
then
echo “ a> a > b”
elif [ aeq 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)) } 1echo2: 1 ” e c h o “ 第 2 个 参 数 :
9echo10: 9 ” e c h o “ 第 10 个 参 数 :
10echo: 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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值