一、 什么是Shell脚本

  shell脚本并不能作为正式的编程语言,因为它是在linux的shell中运行的,所以称为shell脚本。事实上,shell脚本就是一些命令的集合。

  假如完成某个需求需要一口气输入10条命令,对于简单的命令,我们可以直接在shell窗口中输入,但如果是比较长且复杂的命令,一次一次敲就会显得很麻烦。我们可以把这10条命令都记录到一个文档中,然后去调用文档中的命令,这样就能一步操作完成,以后再遇到这个需求的时候也只需要调用这个文档就行了,这个文档就是shell脚本,只是这个文档有它特殊的格式。

  shell脚本能帮我们很方便地管理服务器,我们可以指定一个任务计划,定时去执行某个shell脚本以满足需求。

  二、shell脚本的创建和执行

  下面来编写第一个脚本:

  vim first.sh #写入下面内容

  #!/bin/bash

  ## This is my first shell script.

  ## Writen by lzx 2018-7-27

  date

  echo "Hello World!"

  shell脚本通常都以.sh作为后缀名,不是说不加.sh的脚本不能运行,只是大家的习惯,这样也方便辨识。

  上面,第一行要以#!/bin/bash开头,表示该文件使用的是bash语法,不设置该行也可以执行,但不符合规范。

  #表示注释,后面跟一些该脚本的相关注释内容,以及作者、创建日期或版本等。注释可以省略,但不建议省略,因为我们的记忆力有限,没有注释我们自己都不知道自己写的脚本是用来干什么的、是什么时候写的。建议从一开始就要养成写脚本的良好习惯,方便自己也方便他人。

  下面来执行上面的脚本:

  # sh first.sh #用sh命令来执行

  2018年 07月 27日 星期五 09:42:54 CST

  Hello World!

  还有一种执行方式:

  # ./first.sh #./表示当前目录

  -bash: ./first.sh: 权限不够

  # chmod +x first.sh #给执行权限

  # ./first.sh

  2018年 07月 27日 星期五 09:44:09 CST

  Hello World!

  使用上面方法来执行shell脚本的前提是脚本本身有执行权限,所以需要给脚本加一个x权限。

  另外,使用sh命令来执行脚本时,可以加-x选项来查看脚本的执行过程:

  # sh -x first.sh

  + date

  2018年 07月 27日 星期五 09:49:22 CST

  + echo 'Hello World!'

  Hello World!

  三、命令date

  # date #显示当前时间

  四、Shell脚本中的变量

  shell脚本中的变量可以是一个数值、一个命令或者一个路径。定义变量的格式为:变量名=变量的值,在脚本中引用变量的值时需要加上符号$。

  五、数字运算

  在脚本中进行数字运算,也会用到变量。

  下面再自定义一个脚本:

  #! /bin/bash

  ## For get the sum of two numbers.

  ## Writen by lzx 2018-7-27

  a=1

  b=2

  sum=$(($a+$b))

  echo "$a+$b=$sum"

  1+2=3

  数学计算要用((…))括起来,并且前面要加上符号$。

  六、获取用户输入

  read命令用于和用户交互,它把用户输入的字符串作为变量值,用法如下:

  #!/bin/bash

  ## Using 'read' in shell script.

  ## Writen by lzx 2018-7-27

  read -p "Please input a number:" x

  read -p "Please input another number:" y

  sum=$[$x+$y]

  echo "The sum of two numbers is:$sum"

  Please input a number:5

  Please input another number:11

  The sum of two numbers is:16

  七、if语句

  不带else

  具体格式如下:

  if 判断语句;then

  command

  fi

  下面自定义一个脚本:

  #!/bin/bash

  read -p "Please input your score: " a

  if ((a<60));then

  echo "You didn't pass the exam."

  fi

  上面出现了((a<60))这样的形式,表示里面的是一个数学运算,(( ))这是shell脚本特有的格式,只用一个小括号或不用括号都会报错,要记住这个格式。

  带有else

  具体格式如下:

  if 判断语句

  then

  command

  else

  command

  fi

  带有elif

  具体格式如下:

  if 判断语句1;then

  command

  elif 判断语句2;then

  command

  else

  command

  fi

  判断数值大小除了可以使用((

  ))的形式外,还可以使用[],但不能使用>、<、=这样的符号了,要使用-lt(小于)、-gt(大于)、-le(小于或等于)、-ge(大于或等于)、-eq(等于)、-ne(不等于)。

  八、和文档相关的判断

  shell脚本中if还经常用于判断文档的属性,比如判断是普通文件还是目录,判断文件是否可读、写、执行权限等。

  if 常用的选项有以下几个:

  -e :判断文件或目录是否存在

  -d :判断是不是目录以及是否存在

  -f :判断是不是普通文件以及是否存在

  -r :判断是否有读权限

  -w :判断是否有写权限

  -x :判断是否有执行权限

  具体格式如下:

  if [ -e filename ]

  then

  command

  fi

  示例如下:

  # if [ -d /home/ ]; then echo ok; fi

  ok

  # if [ -f /home/ ]; then echo ok; fi

  /home/是目录而非文件,所以在判断它是否为文件时并不会显示ok。

  九、case逻辑判断

  在shell脚本中,除了使用if来判断逻辑外,还可以使用case。

  具体格式如下:

  case 变量 in

  value1)

  command

  ;;

  value2)

  command

  ;;

  value3)

  command

  ;;

  *)

  command

  ;;

  esac

  下面自定义一个脚本:

  #!/bin/bash

  read -p "Input a number: " n

  a=$[n%2]

  case $a in

  1)

  echo "The number is odd." # odd:奇数

  ;;

  0)

  echo "The number is even." # even:偶数

  ;;

  *)

  echo "It's not a number!"

  esac

  case脚本常用于编写系统服务的启动脚本。

  十、for循环

  具体格式如下:

  for 变量名 in 循环的条件

  do

  command

  done

  下面自定义一个脚本:

  #!/bin/bash

  for i in `seq 1 5`; do # seq 1 5 表示从1到5的一个序列

  echo $i

  done

  上面,循环的条件是引用系统命令的执行结果seq 1 5,但必须用反引号括起来。

  十一、while

  日常运维工作中,也会经常用while循环来编写死循环的脚本,用于监控某项服务。

  具体格式如下:

  while 条件

  do

  command

  done

  下面自定义一个脚本:

  #!/bin/bash

  a=6

  while [ $a -ge 1]

  do

  echo $a

  a=$[$a-1]

  done

  另外,可以用一个冒号:代替循环条件,这样就可以做到死循环。

  十二、exit

  exit,它作用的范围更大,直接退出整个shell脚本

  目前这些是我们常用的,毕竟咱不是搞运维的,更多的是用它写一写简单的脚本来存储命令。下面我将以px4安装脚本为例说明shell脚本使用:

  ————————————————

相关的视频学习资料

  shell脚本快速入门

  http://www.makeru.com.cn/live/3485_1489.html?s=45051

  linux基础

  http://www.makeru.com.cn/course/details/2058?s=45051

  快速上手linux

  http://www.makeru.com.cn/live/1758_310.html?s=45051

  Linux网络经典案例

  http://www.makeru.com.cn/live/3485_1630.html?s=45051

shell脚本自学笔记的更多相关文章

  1. shell 脚本实战笔记(10)--spark集群脚本片段念念碎

    前言: 通过对spark集群脚本的研读, 对一些重要的shell脚本技巧, 做下笔记. *). 取当前脚本的目录 sbin=`dirname "$0"` sbin=`cd &quo ...

  2. shell脚本编写笔记

    包含转载内容,转载自http://wenku.baidu.com/link?url=jtCHxEYzgGve6P64U3JRQRgU6nhpGvqFLLpWu9I2Htq6hi9TGLudRFkk7r ...

  3. Shell 脚本编程笔记(一) Hello Shell

    最近不断在接触Linux操作系统,对它一个终端走天下的特性感到十分新奇和伟大.同时也被各种命令折磨的死去活来...公司的一个老同事给我讲,在公司的极品geek宅都是只用一个黑黑的框完成一切的.结果我一 ...

  4. shell脚本学习笔记(符号)

    shell脚本的学习: 1.Shell的作用是解释运行用户的命令,用户输入一条命令,Shell就解释运行一条,这样的方式称为交互式(Interactive),Shell还有 一种运行命令的方式称为批处 ...

  5. linux shell脚本编程笔记(二): 分支结构

    1.if if command then commands fi if command then commands else commands fi if command1 then command ...

  6. shell脚本学习笔记 (流编辑器sed)

    sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用很普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出. sed不 ...

  7. shell脚本初学者笔记

    概述 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务. Shell 脚本(shell script),是一种为 shell 编写的脚本程序. Linu ...

  8. shell脚本入门笔记

    转载:http://mp.weixin.qq.com/s?__biz=MzA3MTIxNzkyNg==&mid=204081791&idx=1&sn=27bb1d827e0f8 ...

  9. Shell脚本学习笔记之(自动填充函数模板)

    其实,vii 就是写的一个脚本,跟 vi 没半毛钱关系,只不过借用一下这个名字而已.那这个脚本长什么样呢?look: 下面来详细的解析上面的代码,来看第1行: #!/bin/bash 这是Shell脚 ...

随机推荐

  1. 一文读懂Redis

    目录结构如下: 简介 Redis是一个高性能的key-value数据库.Redis对数据的操作都是原子性的. 优缺点 优点: 基于内存操作,内存读写速度快. Redis是单线程的,避免线程切换开销及多 ...

  2. NIO.2中Path,Paths,Files类的使用

    Java NIO Java NIO概述 Java NIO(New IO(新io),Non-Blocking IO(非阻塞的io))是从Java 1.4版本开始引入的一套新的IO API,可以替代标准的 ...

  3. golang 注释 exported function xxx should have comment or be unexported

    0x00 问题 exported function xxx should have comment or be unexported. 0x01 解决 https://golang.org/s/sty ...

  4. 制作Windows服务和安装程序(C#版)

    http://blog.sina.com.cn/s/blog_5f4ffa170100vt2b.html 1.创建服务项目: 打开VS 2005 编程环境,在C#中新建Windows服务程序 2.将安 ...

  5. logstash-input-jdbc配置说明

    Logstash由三个组件构造成,分别是input.filter以及output.我们可以吧Logstash三个组件的工作流理解为:input收集数据,filter处理数据,output输出数据.至于 ...

  6. CSS linear-gradient() 函数

    用于背景颜色渐变或画线条等场景 linear-gradient() 函数用于创建一个表示两种或多种颜色线性渐变的图片. 创建一个线性渐变,需要指定两种颜色,还可以实现不同方向(指定为一个角度)的渐变效 ...

  7. python处理权限关系一些注意事项

    在模型类中多对多的关系(必须是对象) 如果要获取多对多表中的值,必须使用对象进行搜索,不能直接输入名称 例:这样才能查找到(下面例子是针对,组设置多对多关到用户,现在要根据用户获取相应的组) user ...

  8. P3307-[SDOI2013]项链【Burnside引理,莫比乌斯反演,特征方程】

    正题 题目链接:https://www.luogu.com.cn/problem/P3307 题目大意 \(n\)个珠子的一个环形项链,每个珠子有三个\(1\sim k\)的整数. 两个珠子不同当且仅 ...

  9. YbtOJ-大收藏家【分层图,最大流】

    正题 题目链接:https://www.ybtoj.com.cn/contest/117/problem/2 题目大意 \(n\)个人,每人有\(a_i\)个属于自己的物品.\(m\)次交换依次进行, ...

  10. P5110-块速递推【特征方程,分块】

    正题 题目链接:https://www.luogu.com.cn/problem/P5110 题目大意 数列\(a\)满足 \[a_n=233a_{n-1}+666a_{n-2},a_0=0,a_1= ...