介绍
1. Shell介绍
(1)shell是一种命令语言,也是一个用 C 语言编写的程序 (命令解释器->“翻译官”)
(2)作用:主要提供一个接口使用户与内核交互操作。
(3)流程:接收用户输入的命令并且进行解析,然后将命令送入内核去执行 -> 最后将结果返回给用户。
2.Shell常见类型
名称
来源
比较
sh (Bourne Shell)
AT&T Bell实验室的Steve Bourne开发
最早
csh (C Shell)
加州伯克利大学的Bill Joy
更强
ksh (Korn Shell)
AT&T Bell实验室的David Korn开发
升级
bash(Bourne Again Shell)
自由软件基金会(GNU)开发的一个Shell
统一
查看shell指令
查看当前系统支持的shell类型:
cat /etc/shells
查看当前使用的shell类型:
echo $SHELL
3.Bash介绍
3.1 bash功能(内部命令和外部命令)
3.2 bash 语法
脚本文件创建及运行
(a)穿件bash文件:
vi 文件名.sh 或者 vi 文件名
(b) 在文件名头部申明
#!/bin/bash
代码段
(c)运行:
chmod a+x 路径及文件名.sh // 修改文件权限---可执行
方法1: sh 路径及文件名.sh(推荐)
方法2: /bin/bash 路径及文件名.sh (文件中可省去申明,但是必须在/bin/bash 路径下)
方法3: source 路径及文件名.sh
方法4: . 路径及文件名.sh
示例: 创建test.sh脚本并输出hello world
文件或者目录权限修改
名称
语法
更改拥有者(change own)
chown -R 拥有者待更改的文件
更改所属组(change group
chgrp -R 所属组待更改的文件
更改权限(change mode)
chmod -R ABC 待更改的文件
更改权限(change mode)
chmod -R ,...,待更改的文件
ABC分别代表(拥有者、所属组、其他组)
augo分别代表(所有用户,拥有者、所属组用户、其他组用户)
权限范围:+ 追加、- 移除、= 修改
数字表示(1-执行,2-可写,3-可写可执行,4-可读,5-可读可执行,6-可读可写,7可读可写可执行)
目录或文件授权rwx作用
代表字母
权限
文件含义
目录含义
r
读权限
查看文件内容
列出目录内容 (ls 指令)
w
写权限
修改文件
目录中创建删除文件
x
执行权限
可以执行文件
可以进入目录(cd指令)
4.shell 变量
4.1 本地变量
概念:
只对当前shell进程有效(ps. 对当前进程的子进程和其它shell进程无效)
语法:
设置:变量名=变量值(等号不能有空格)
删除:unset 变量名
输出:echo $变量名
示例代码:
like@ubuntu:~$ test=1 --创建变量
like@ubuntu:~$ echo $test --打印变量
1
like@ubuntu:~$ unset test -- 删除变量
like@ubuntu:~$ echo $test
like@ubuntu:~$
4.2 环境变量
概念:
环境变量名词,效果执行一个命令会去“环境变量”设置的目录中挨个找该命令的可执行程序(1-找到了直接执行,2-找不到则报错)
语法:
export 变量名=变量值
注:
1.当环境变量在/etc/profile 中申明后, 对所有用户都有效.
2.在家目录中的.bashrc 中申明后, 对当前用户都有效
3.需要执行source /etc/profile 或者重启shell 窗口才能生效
4.3 局部变量
概念:
函数中申明的变量,函数调用时创建、调用完毕时销毁
语法:
local 变量名=变量值
示例代码:
like@ubuntu:~$ function ab(){
> local a=10
> echo $a
> }
like@ubuntu:~$ ab
10
like@ubuntu:~$ echo $a. --函数调用完毕后, 变量释放
like@ubuntu:~$
4.4 位置变量
概念:
指程序运行时动态传入参数
语法:
sh 路径及文件名 参数1 ... 参数n
echo $1 / .. / echo $n
示例代码:
like@ubuntu:~$ vim test1.sh
like@ubuntu:~$ cat test1.sh
#!/bin/bash
echo $1
echo $2
like@ubuntu:~$ sh test1.sh 10 20 --- 将10 ,20 传值给第一个参数和第二个参数
10
20
4.5 特殊变量
概念:
系统定义的特殊含义的变量(预定义变量)
变量
含义
$0
当前脚本的文件名
$n
传递给脚本或函数的参数。n 表示第几个参数。例如,第一个参数是$1
$#
传递给脚本或函数的参数个数。
$*
传递给脚本或函数的所有参数。
$@
传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$?
上个命令的退出状态,或函数的返回值。
$$
当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
4.6 文件通配符
符号
含义
*
匹配0个或多个任意字符
?
匹配一个任意字符
[若干字符]
匹配中括号中的一个字符
示例:
匹配5结尾的.doc文件 (ls 5.doc)
匹配a开头的.doc文件 (ls a.doc)
匹配第二个字符是a或1的.doc文件 (ls ?[1a]*.doc)
4.7 命令代换
概念:
通过语法反引号或$(名称)实现先解析shell指令,再赋值给变量
示例代码:
like@ubuntu:~$ date
2018年 10月 29日 星期一 20:47:26 CST
like@ubuntu:~$ a1=$(date)
like@ubuntu:~$ echo $a1
2018年 10月 29日 星期一 20:47:53 CST
like@ubuntu:~$ a2=`date`
like@ubuntu:~$ echo $a2
2018年 10月 29日 星期一 20:48:14 CST
4.9 算数代换
概念:
通过
[]实现运算功能。
注: 在脚本文件中只能使用$(())
示例代码:
like@ubuntu:~$ echo 1+1
1+1
like@ubuntu:~$ echo $((1+1))
2
like@ubuntu:~$ echo $[ 1+1 ]
2
like@ubuntu:~$ a1=2
like@ubuntu:~$ echo $(($a1+1))
3
like@ubuntu:~$ echo $[ ${a1}+1 ]
3
5.shell 流程控制(判断)
5.1 条件测试
概念:
通过test或 [] 可以测试一个条件是否成立
语法:
--方法一
test 值1 条件 值2
--方法二
[值1 条件 值2]
脚下留心:0-代表结果成立,1-代表结果不成立
示例代码: 5>3 ? 5>7 ?
like@ubuntu:~$ [ 5 -gt 3 ]
like@ubuntu:~$ echo $?
0
like@ubuntu:~$ [ 5 -gt 7 ]
like@ubuntu:~$ echo $?
1
5.2 if else 语句
语法:
if 条件1
then
命令1
elif 条件2
then
命令2
else
命令
fi
示例代码1:
判断成绩(>=90优秀,>=80良好,>=60及格,>=0不及格)
like@ubuntu:~$ vim test3.sh
like@ubuntu:~$ cat test3.sh
#!/bin/bash
SCORE=$1
if [ $SCORE -ge 90 ]
then
echo '优秀'
elif [ $SCORE -ge 80 ]
then
echo '良好'
elif [ $SCORE -ge 70 ]
then
echo '一般'
elif [ $SCORE -ge 60 ]
then
echo '及格'
elif [ $SCORE -ge 0 ]
then
echo '不及格'
else
echo '有瑕疵'
fi
like@ubuntu:~$ sh test3.sh 99
优秀
示例代码2:
判断当前执行脚本是否是root用户
vim who.sh
like@ubuntu:~$ cat who.sh
#!/bin/bash
who=$(whoami)
if [ $who!='root' ]
then
echo 'wrong'
echo $who
else
echo 'right'
fi
like@ubuntu:~$ sh who.sh
wrong
like
5.3 case语句
语法:
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
....
*)
如果以上都不成立,则执行此程序
;;
esac
示例代码:
需求:执行脚本让用户输入
yes - installing...
no - skip
其他 - Please enter the correct option
like@ubuntu:~$ vim case.sh
like@ubuntu:~$ cat case.sh
#!/bin/bash
read -p "Please Input yes/no: " Select_Id
case $Select_Id in
"yes")
echo 'installing...'
;;
"no")
echo 'skip'
;;
*)
echo 'Please enter the correct option'
;;
esac
like@ubuntu:~$ sh case.sh
Please Input yes/no: yes
installing...
like@ubuntu:~$ sh case.sh
Please Input yes/no: no
skip
6.shell 循环
6.1 for 循环
语法:
for 变量名 in 值1 ... 值N
do
命令
done
示例代码1:
输出6个数
like@ubuntu:~$ vim for.sh
like@ubuntu:~$ cat for.sh
#!/bin/bash
for i in 1 2 3 4 5 6
do
echo $I
done
like@ubuntu:~$ sh for.sh
1
2
3
4
5
6
示例代码2:
输出指定目录下得所有文件名
like@ubuntu:~$ vim for1.sh
like@ubuntu:~$ cat for1.sh
#!/bin/bash
cd $1
filenames=$(ls)
for name in $filenames
do
echo $name
done
like@ubuntu:~$ sh for1.sh /home
like
6.2 while 循环
语法:
while 条件
do
命令
done
示例代码1:
输出1-10
like@ubuntu:~$ vim while.sh
like@ubuntu:~$ cat while.sh
#!/bin/bash
I=1
while [ $i -le 10 ]
do
echo $I
i=$(($i+1))
done
like@ubuntu:~$ sh while.sh
1
2
3
4
5
6
7
8
9
10
7. 计划任务
7.1 介绍
概 念:约定时间执行指定任务(或执行指定脚本文件)
举例1:通过计划任务定时发布文章
举例2:通过计划任务凌晨3点将测试服务器项目代码同步到线上服务器
7.2 使用
步骤1:通过命令【crontab -e】编写计划任务
步骤2:按【i】键编写,最后按【esc】【:wq】保存并退出
-- crontab 指令介绍
usage: crontab [-u user] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
(default operation is replace, per 1003.2)
-e (edit user's crontab) ---编写计划
-l (list user's crontab) --- 查看计划
-r (delete user's crontab) --- 删除计划
-i (prompt before deleting user's crontab) --- 删除计划前提示
7.3 语法
* * * * * 任务
项目
含义
范围
第一个*
分钟
0~59
第二个*
小时
0~23
第三个个*
天数
1~31
第四个*
月份
1~12
第五个*
星期
0~7(0&7代表星期天)
项目
含义
例子
,
代表不连续时间
0 8,12,16 * * * 每天8,12,16点执行
-
代表连续时间
0 5 * * 1-6 每周一到六 5点执行
* /n
代表间隔多久执行
*/10 * * * *每隔10min执行
示例代码:
// 创建计划任务
like@ubuntu:~$ crontab -u like -e
no crontab for like - using an empty one
crontab: installing new crontab
// 查看计划任务
like@ubuntu:~$ crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
*/1 * * * * echo 9 >> /home/like/test.txt ---- 每分钟给test.txt 追加9
like@ubuntu:~$ crontab -r -- 删除计划
like@ubuntu:~$ crontab -l
no crontab for like -- 删除成功
示例2:
时间
含义
45 22 * * * 命令
在22点45分执行
0 17 * * 1 命令
每周一17点执行
0 5 1,15 * * 命令
每月1和15号5点执行
40 4 * * 1-5 命令
每周1~5 4点40 执行
*/10 4 * * * 命令
每天4点每隔10min执行
0 0 1,15 * 1 命令
每月1和15 号 每周一的0点执行