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 <+-=>,...,待更改的文件

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

你可能感兴趣的:(shell 脚本(Linux--ubuntu))