介绍
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点执行 |