shell 脚本(Linux--ubuntu)

介绍

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指令
  1. 查看当前系统支持的shell类型:
cat /etc/shells
  1. 查看当前使用的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 <augo><+-=><rwx>,...,待更改的文件

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点执行
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,233评论 6 495
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,357评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,831评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,313评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,417评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,470评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,482评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,265评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,708评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,997评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,176评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,503评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,150评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,391评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,034评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,063评论 2 352

推荐阅读更多精彩内容