shell笔记
1.变量
系统变量
利用set查看系统中的所有变量
自定义变量
1.基本语法
(1)定义变量:变量名=值
(2)撤销变量:unset 变量名
(3)声明静态变量:readonly变量,注意:不能unset
2.变量定义规则
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
(2)等号两侧不能有空格
(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
(4)变量的值如果有空格,需要使用双引号或单引号括起来。
- 案例
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 export和source关键字
export name=lisi 将变量的范围作用在所有的子bash中
source 将子bash定义的变量 作用在当前bash
6 单引号和双引号的区别
现象:单引号里的内容会全部输出,而双引号里的内容会有变化
原因:单引号会将所有特殊字符脱意
特殊变量
$n (参数) | 用来接收脚本执行是传入的参数的变量 ,n为数字,$0代表命令本身,$1- 9 代 表 第 一 到 第 9 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 9代表第一到第9个参数, 十以上的参数需要用大括号包含,如 9代表第一到第9个参数,十以上的参数需要用大括号包含,如{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(隐藏输入)
2.运算符
(1)“ ( ( 运 算 式 ) ) ” 或 “ ((运算式))”或“ ((运算式))”或“[运算式]”
(2)expr + , - , *, /, % 加,减,乘,除,取余
注意:expr运算符间要有空格
3.条件判断
数字
字符串
文件的判断
-
test
-
[ ]
-
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
-
case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
-
双分号“;;”表示命令序列结束,相当于java中的break。
-
最后的“*)”表示默认模式,相当于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. 系统函数
-
basename基本语法
basename [string / pathname] [suffix]
功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
选项: suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
-
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