Shell笔记

shell笔记

1.变量

系统变量

利用set查看系统中的所有变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TRawrxVy-1601110161547)(C:\Users\jiayue\AppData\Roaming\Typora\typora-user-images\1597236242544.png)]

自定义变量

1.基本语法

(1)定义变量:变量名=值

(2)撤销变量:unset 变量名

(3)声明静态变量:readonly变量,注意:不能unset

2.变量定义规则

​ (1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写

​ (2)等号两侧不能有空格

​ (3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。

​ (4)变量的值如果有空格,需要使用双引号或单引号括起来。

  1. 案例

A=5 echo $A 普通的变量

readonly B=2 echo $B 只读变量

在bash中,变量默认类型都是字符串类型,无法直接进行数值运算 C=1+2

变量的值如果有空格,需要使用双引号或单引号括起来 D=“I love banzhang”

4 变量的取值

​ 1) $A

​ 2) ${A}

​ 3) “$a”

5 exportsource关键字

export name=lisi 将变量的范围作用在所有的子bash中

source 将子bash定义的变量 作用在当前bash

6 单引号和双引号的区别

现象:单引号里的内容会全部输出,而双引号里的内容会有变化

原因:单引号会将所有特殊字符脱意

特殊变量

$n (参数)用来接收脚本执行是传入的参数的变量 ,n为数字,$0代表命令本身,$1- 9 代 表 第 一 到 第 9 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 9代表第一到第9个参数, 十以上的参数需要用大括号包含,如 99,{10}。 ${10}
$*代表命令行中所有的参数,把所有的参数看成一个整体。以"$1 $2 … $n"的形式输出所有参数
$@代表命令行中的所有参数,把每个参数区分对待。以"$1" “ 2 " … " 2" … " 2""n” 的形式输出所有参数
$#代表命令行中所有参数的个数。添加到shell的参数个数
$?执行上一个命令的返回值 执行成功,返回0,执行失败,返回非0(具体数字由命令决定)
$$当前进程的进程号(PID),即当前脚本执行时生成的进程号
$!后台运行的最后一个进程的进程号(PID),最近一个被放入后台执行的进程 &

∗ 和 * 和 @的区别

$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号" “包含时,都以”$1" “ 2 " … " 2" … " 2""n” 的形式输出所有参数

当它们被双引号" “包含时,”$*" 会将所有的参数作为一个整体,以"$1 $2 … n " 的 形 式 输 出 所 有 参 数 ; " n"的形式输出所有参数;" n""@" 会将各个参数分开,以"$1" “ 2 " … " 2" … " 2""n” 的形式输出所有参数

read

read [选项] 值

read -p(提示语句) -n(字符个数) -t(等待时间,单位为秒) –s(隐藏输入)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h0UJGjr1-1601110161552)(C:\Users\jiayue\AppData\Roaming\Typora\typora-user-images\1597237417333.png)]

2.运算符

(1)“ ( ( 运 算 式 ) ) ” 或 “ ((运算式))”或“ (())[运算式]”

(2)expr + , - , *, /, % 加,减,乘,除,取余

​ 注意:expr运算符间要有空格

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lqOcSMWF-1601110161554)(C:\Users\jiayue\AppData\Roaming\Typora\typora-user-images\1597238228631.png)]

3.条件判断

数字

字符串

文件的判断

  1. test

  2. [ ]

  3. test $name == zm [空格 $name 空格 == 空格 zm 空格 ]

[ expression ]

[ “1” = “2” ]

或者:test expression

​ [ condition ](注意condition前后要有空格)

​ 测试范围:整数、字符串、文件

字符串的测试

test str1 == str2 测试字符串是否相等

test str1 != str2 测试字符串是否不相等

test str1 测试字符串是否不为空 !=null 【 str 】 【 $str 】 如果为空返回false(null!=str)

{}

test -n str1 测试字符串是否不为空,不为空,true,false
test -z str1 测试字符串是否为空

整数测试

test int1
-eq int2 测试整数是否相等 equals
test int1 -ge int2 测试int1是否>=int2
test int1 -gt int2 测试int1是否>int2
test int1 -le int2 测试int1是否<=int2
test int1 -lt int2 测试int1是否<int2
test int1 -ne int2 测试整数是否不相

文件测试

tes -d file 指定文件是否目录

test **–**e file 文件是否存在 exists
test -f file 指定文件是否常规文件
test –L file 文件存在并且是一个链接 ln -s
test -r file 指定文件是否可读
test -w file 指定文件是否可写

test -x file 指定文件是否可执行

多重测试

多重条件

-a and

-o or

[root@doit001 day03]# [ -r ./first.sh -a -w ./first.sh ] && echo “en” || echo “enen~~~”

en

[root@doit001 day03]# [ -r ./first.sh -o -x ./first.sh ] && echo “en” || echo “enen~~~”

en

[root@doit001 day03]# [ -r ./first.sh -a -x ./first.sh ] && echo “en” || echo “enen~~~”

enen~~~

&& 和 ||

&& 逻辑与 条件满足,才执行后面的语句

[ -z “$name” ] && echo invalid || echo ok

|| 逻辑或,条件不满足,才执行后面的语句

test “$name” == ”yangmi” && echo ok || echo invalid

4.流程控制

1.1. if

1.1.1.基本语法

if [ 条件判断式 ]

then

程序

fi

或者

if [ 条件判断式 ]

then

​ 程序

fi

多分枝

if [ 条件判断式1 ]

​ then

​ 当条件判断式1成立时,执行程序1

elif [ 条件判断式2 ]

​ then

​ 当条件判断式2成立时,执行程序2

…省略更多条件

else

​ 当所有条件都不成立时,最后执行此程序

fi​

1.1.2.示例

#!/bin/bash

read -p “please input your name:” NAME

#echo $NAME

if [ “$NAME” == root ]

​ then

​ echo “hello ${NAME}, welcome !”

​ elif [ $NAME == tom ]

​ then

​ echo “hello ${NAME}, welcome !”

​ else

​ echo “SB, get out here !”

fi

注意事项:

(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格

(2)if后要有空格

1.2. case

1.2.1.基本语法

case $变量名 in

“值1”)

​ 如果变量的值等于值1,则执行程序1

​ ;;

“值2”)

​ 如果变量的值等于值2,则执行程序2

​ ;;

…省略其他分支…

*)

​ 如果变量的值都不是以上的值,则执行此程序

​ ;;

esac

  1.  case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
    
  2.  双分号“;;”表示命令序列结束,相当于java中的break。
    
  3.  最后的“*)”表示默认模式,相当于java中的default。
    

4) 空格符也要多注意

1.2.2.示例

!/bin/bash

case $1 in

“1”)

​ echo “banzhang”

;;

“2”)

​ echo “cls”

;;

*)

​ echo “renyao”

;;

esac

1.3. for

1.3.1.基本语法

第一种:

​ for (( 初始值;循环控制条件;变量变化 ))

​ do

​ 程序

​ done

第二种:

for N in 1 2 3

do

​ echo $N

done

for N in 1 2 3; do echo $N; done

for N in {1…30}; do echo $N; done

1.3.2.示例

#!/bin/bash

s=0

for((i=0;i<=100;i++))

do

​ s= [ [ [s+$i]

done

echo $s

#!/bin/bash

#打印数字

for i in $*

​ do

​ echo "ban zhang love $i "

​ done

1.4. while

1.4.1.基本语法

while [ 条件判断式 ]

do

​ 程序

done

1.4.2.示例

#!/bin/bash

s=0

i=1

while [ $i -le 100 ]

do

​ s= [ [ [s+$i]

​ i= [ [ [i+1]

done

echo $s

​ Code

5.函数(方法)

1.1. 系统函数

  1.  basename基本语法
    

basename [string / pathname] [suffix]

功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。

选项: suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。

  1.  dirname基本语法
    

​ dirname 文件绝对路径

功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)

basename /home/banzhang.txt -----> banzhang.txt

basename /home/banzhang.txt .txt -----> banzhang

dirname /home/banzhang.txt -----> home/atguigu

1.2. 自定义函数

1.2.1.基本语法

函数代表着一个或一组命令的集合,表示一个功能模块,常用于模块化编程。

重要说明:

在shell中,函数必须先定义,再调用

使用return value来获取函数的返回值

函数在当前shell中执行,可以使用脚本中的变量。

格式如下:

函数名()

{

命令1……

命令2….

return 返回值变量

}

[ function ] funname [()]

{

action;

[return int;]

}

如果函数名后没有(),在函数名和{ 之间,必须要有空格以示区分。

函数返回值,只能通过$? 系统变量获得,可以显示加:return 返回值,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

1.2.2.示例

#!/bin/bash

function sum()

{

s=0

s=$[ $1 + $2 ]

echo "$s"

}

read -p "Please input the number1: " n1;

read -p "Please input the number2: " n2;

sum $n1 $n2;

1.3. 脚本调试

sh -x script
这将执行该脚本并显示所有变量的值。

在shell脚本里添加

set -x 对部分脚本调试
sh -n script
不执行脚本只是检查语法的模式,将返回所有语法错误。

sh –v script

执行并显示脚本内容

6. 定时器***

定时的执行shell命令或者脚本!!!

crontab 命令允许用户提交、编辑或删除相应的作业。每一个用户都可以有一个crontab 文件来保存调度信息。可以使用它运行任意一个 s h e l l 脚本或某个命令。

作用:用于生成cron进程所需要的crontab文件

crontab的命令格式

# crontab -e 创建一个定时器任务
crontab文件格式: minute hour day-of-month month-of-year day-of-week commands

分< >时< >日< >月< >星期< > 要运行的命令 < >表示空格

Minute 一小时中的哪一分钟 [0~59]

hour                

一天中的哪个小时
[0~23]

day-of-month       一月中的哪一天      
[1~31] 

month-of-year      一年中的哪一月      
 [1~12] 

day-of-week        

一周中的哪一天
[0~6] 0表示星期天

commands            执行的命令 

书写注意事项
1,全都不能为空,必须填入,不知道的值使用通配符*表示任何时间
2,每个时间字段都可以指定多个值,不连续的值用,间隔,连续的值用-间隔。
3,命令应该给出绝对路径
4,用户必须具有运行所对应的命令或程序的权限

如何使用crontab 运行多个任务:

方法1:在crontab -e 里 写多个

输入命令 crontab –e -r(移出定时任务)

正常是删除指定的哪行任务

敲回车

开始编写任务:

把所有的任务,写入到一个可执行的文件

再在crontab -e里面配置执行任务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wQh8lVKo-1601110161557)(file:///C:/Users/jiayue/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png)]

分钟 小时 天 月 星期 命令/脚本

示例:

eg:4点备份

0 4 * * * cp -r /logs /root/

分 时 日 月 周

eg:每周二至周五,下午6点 的计划任务

* 18 * * 2-5 (2,3,4,5)

eg:1到10月份,每周二周五,下午6点的计划任务

0 18 * 1-10 2,5

eg:周一到周五下午,5点半提醒学生15分钟后关机

30 17 * * 1-5 /usr/bin/wall < /etc/issue

45 17 * * 1-5 /sbin/shutdown -h now

eg:学校的计划任务, 12点14点,检查apache服务是否启动

* 12-14 * 1-3,7-9 1-5

eg:再添加一个备份,把/etc目录备份到/backup下,然后把错误的情况也记录下来,正确的文件都丢到/dev/null下,看不见(相当于一个黑洞)

*/2 12-14 * 3-6,9-12 1-5 /bin/cp -r /etc /backup/etc.20170407 2> /backup/etc.bak.err

/dev/null

eg:每月 1、1 0、2 2日的4:45运行/apps/bin目录下的backup.sh

45 4 1,10,22 * * /apps/bin/backup.sh

eg:每周六、周日的 1 : 10运行一个find命令

10 1 * * 6,0 /bin/find -name “core” -exec rm {} ;

eg:在每天 18:00至23 :00之间每隔30分钟运行/apps/bin目录下的dbcheck.sh

0,30 18-23 * * * /apps/bin/dbcheck.sh

eg:每星期六的 11:00 pm运行/apps/bin目录下的qtrend.sh

0 23 * * 6 /apps/bin/qtrend.sh

eg:学校的计划任务, 12点14点,检查apache服务是否启动

* 12-14 * 1-3,7-9 1-5

eg:再添加一个备份,把/etc目录备份到/backup下,然后把错误的情况也记录下来,正确的文件都丢到/dev/null下,看不见(相当于一个黑洞)

*/2 12-14 * 3-6,9-12 1-5 /bin/cp -r /etc /backup/etc.20170407 2> /backup/etc.bak.err

/dev/null

eg:每月 1、1 0、2 2日的4:45运行/apps/bin目录下的backup.sh

45 4 1,10,22 * * /apps/bin/backup.sh

eg:每周六、周日的 1 : 10运行一个find命令

10 1 * * 6,0 /bin/find -name “core” -exec rm {} ;

eg:在每天 18:00至23 :00之间每隔30分钟运行/apps/bin目录下的dbcheck.sh

0,30 18-23 * * * /apps/bin/dbcheck.sh

eg:每星期六的 11:00 pm运行/apps/bin目录下的qtrend.sh

0 23 * * 6 /apps/bin/qtrend.sh

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值