Shell是什么

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

。我们经常说的shell通常都是指shell脚本

环境和工具

Shell跟java、php、Python编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器

就可以了。

Mac OS,Linux 自带了shell解释器,Windows比较麻烦,因为Win7专业版和旗舰版默认安装PowerShell,标准版和家庭版中就没有安装的,为了方便建议安装cygwin

PHP、Python 也可以作为Shell编程

PHP、Python是属于高级编程语言,但是也可以做Shell编程,因为只要有解释器,也可以用作脚本编程

如下是一个Python Shell Script示例(假设文件名叫op_python_base.py):

#!/usr/bin/env python3 //告诉Python从系统环境中找python
# -*- coding: utf-8 -*- //设置为UTF-8编码
for index in range(10):print(index);

源码:op_python_base

如下是一个PHP Shell Script示例(假设文件名叫op_php_base.php):

#!/usr/bin/php
<?phpfor($i=0 ;$i<10; $i++){echo $i;
}?>

源码:op_php_base

为什么要学习Shell

既然PHP、Python都可以用来写脚本编程,那为什么还要学习陌生、晦涩难懂的Shell,主要有一下几个原因

  • 环境兼容性,Win7专业版和旗舰版默认安装PowerShell,标准版和家庭版中就没有安装的,其他主流的操作系统都预制了Shell解释器,所以使用sh、bash编写,提供给其他人使用是非常方便的,但是PHP、Python 等等需要安装相应的环境
  • 如果你想做一些定时任务比如说检测进程是否存在,自动备份,或者说自动部署环境、服务器之间的数据同步等等sh、bash会是你最好的选择

sh与bash

sh: Bourne shell,POSIX(Portable Operating System Interface)标准的shell解释器,它的二进制文件路径通常是/bin/sh

bash: Bash是Bourne shell的替代品,属GNU Project,二进制文件路径通常是/bin/bash

第一个shell脚本

我们先来看一个例子

我相信写过代码的童鞋,应该对下面的代码很熟悉并不陌生,(假设文件名叫op_base.sh):

#!/usr/bin/env bash
mkdir code

cd  code
for ((i=0; i<3; i++)); dotouch test_${i}.txtecho "shell很简单" >> test_${i}.txt
done

第一行:从系统path中寻找指定脚本的解释程序
第二行:创建 名叫code文件夹

第三行:进入创建的文件夹
第四行:for循环3次
第四行:创建文件
第五行:往创建的文件中写入信息
第六行:结束循环

mkdir, touch,cd,touch,echo都是系统命令,在命令行下可以直接执行
for, do, done 是shell脚本语言 for循环的语法

源码:op_base.sh

编写Shell

新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php,扩展名为php,如果你用Python,扩展名为python

第一行一般是这样:

#!/usr/bin/php
#!/usr/bin/env python3
#!/usr/bin/env bash

#!”是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行
/env 是系统的PATH目录中查找

运行 Shell 脚本有两种方法:

作为可执行程序

chmod +x op_base.sh
./op_base.sh

第一行设置 op_base.sh可执行权限
第二行执行op_base.sh

作为参数

/bin/sh op_base.sh

变量

定义变量时,变量名前不需要加符号和Python一样但是在PHP语言中变量需要加

my_name="jack"
my_name='jack';

ps: 变量名和等号之间不能有空格,变量后面不能有;

Shell中的引号和PHP类似,字符串可以用单引号,也可以用双引号

单引号字符串的限制:

单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
单引号字串中不能出现单引号(对单引号使用转义符后也不行

双引号:

双引号里可以有变量
双引号里可以出现转义字符

但是在Python中单引号和双引号是没有区别,但是Python 还有三个引号,在三个引号内字符都不会被转义

使用变量

对于已经定义过的变量,使用的适合在前面添加,如:¨G6Gps:变量名和等号之间不能有空格,变量后面不能有;Shell中的引号和PHP类似,字符串可以用单引号,也可以用双引号单引号字符串的限制:<ul><li>单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的</li><li>单引号字串中不能出现单引号(对单引号使用转义符后也不行</li></ul>双引号:<ul><li>双引号里可以有变量</li><li>双引号里可以出现转义字符</li></ul>但是在Python中单引号和双引号是没有区别,但是Python还有三个引号,在三个引号内字符都不会被转义¨K44K对于已经定义过的变量,使用的适合在前面添加

echo $my_name
echo ${my_name}

变量名外面的花括号是可选的,加不加都行,建议使用第二种形式

注释

以“#”开头的行就是注释,会被解释器忽略。

多行注释

sh里没有多行注释,只能每一行加一个#号。就像这样:

#--------------------------------------------
# Author:  jack
#
# Notes: 10分钟入门Shell脚本编程
#
# Project home page:
#       https://github.com/hi-dhl/fast_guides
#--------------------------------------------

字符串

字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似

Shell不像其他语言有php、python 有很多数据类型,在Shell中常用的数据类型字符串数字和字符串(ps: 除了数字和字符串,也没啥其它类型好用了,哈哈)

单引号字符串的限制:

单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
单引号字串中不能出现单引号(对单引号使用转义符后也不行

双引号:

双引号里可以有变量
双引号里可以出现转义字符

字符串操作

拼接字符串

my_name="jack";
my_age="20岁"
echo $my_name $my_age
echo $my_name$my_age

获取字符串长度

echo ${#my_name}

截取字符串

echo ${my_name:0:2}

源码:op_str.sh

Shell 数组

定义数组

在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:

name=(name1 name2 name3)

还可以单独定义数组的各个分量:

ary[0]=name1
ary[1]=name2
ary[3]=name3

ps: 可以不使用连续的下标,而且下标的范围没有限制

读取数组

读取数组元素值的一般格式是:

${数组名[下标]}

例如:

echo ${name[0]}

使用@符号可以获取数组中的所有元素,例如:

echo ${name[@]}

获取数组的长度

获取数组长度

的方法与获取字符串长度的方法相同,例如:

# 取得数组元素的个数
length=${#name[@]}
echo $length# 或者
length=${#name[*]}
echo $length# 取得数组单个元素的长度
lengthn=${#name[n]}
echo $length

源码:op_arry.sh

Shell 流程控制

和Java、PHP、Python等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法):

<?php
if (isset($_GET["q"])) {search(q);
}
else {// 不做任何事情
}

在sh/bash里可不能这么写,如果else分支

没有语句执行,就不要写这个else

if

if condition1
thencommand1
elif condition2
then command2
elsecommandN
fi

例子:

#!/usr/bin/env bash
a=1
b=2
if [ $a == $b ]thenecho "a 等于 b"elif [ $a -gt $b ]thenecho "a 大于 b"elif [ $a -lt $b ]thenecho "a 小于 b"elseecho "没有符合的条件"fi

源码:op_if.sh

for 循环

Shell的for循环和Python 有点类似

Python的for循环

for index in 1,2,3,4,5:print(index);

Shell的for循环,第一种写法

for index in 1 2 3 4 5; doecho "index="$index
done

Shell的for循环,第二种写法

for ((i=0; i<5; i++)); doecho "i="$i
done

源码:op_for.sh

while 语句

while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。

int=1
while(( $int<=5 ))
doecho $intlet "int++"
done

源码:op_while.sh

Shell结合系统命令

sh脚本结合系统命令便有了强大的威力,在字符处理领域,有grep、awk、sed三剑客,grep负责找出特定的行,awk能将行拆分成多个字段,sed则可以实现更新插入删除等写操作。

例如定时检测nginx、mysql是否被关闭

path=/var/log
log=${path}/httpd-mysql.logname=(apache mysql)exs_init[0]="service httpd start"
exs_init[1]="/etc/init.d/mysqld restart
"for ((i=0; i<2; i++)); doecho "检查${name[i]}进程是否存在"ps -ef|grep ${name[i]} |grep -v grepif [ $? -eq 0 ]; thenpid=$(pgrep -f ${name[i]})echo "`date +"%Y-%m-%d %H:%M:%S"` ${name[$i]} is running with pid $pid" >> ${log}else$(${exs_init[i]})echo "`date +"%Y-%m-%d %H:%M:%S"` ${name[$i]} start success" >> ${log}fi
done

解释:检测 nginx、mysql进程是否存在,如果不存在了会自动重新启动。
脚本每次运行会写日志的,没事可以去看看该日志文件,如果进程是不是真的经常性不存在,恐怕就要排查一下深层原因了。

源码:check_nginx.sh

编辑 /etc/crontab 文件

crontab -e

在文件最后添加一行:

*/5 * * * * /xxx/check_nginx.sh > /dev/null 2>&1

上表示每 5 分钟,执行一下脚本 /xxx/check_nginx.sh,其中xxx代表路径

/dev/null 2>&1 的意思是该条shell命令

将不会输出任何信息到控制台,也不会有任何信息输出到文件中。

# For details see man 4 crontabs# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * command to be executed

添加完配置,需要重启才能生效

service crond restart

10分钟入门Shell脚本编程相关推荐

  1. 学习笔记之Linux Shell脚本教程:30分钟玩转Shell脚本编程

    Linux Shell脚本教程:30分钟玩转Shell脚本编程 http://c.biancheng.net/cpp/shell/ 转载于:https://www.cnblogs.com/pegasu ...

  2. shell 脚本编程的10 个最佳实践

    每一个在UNIX/Linux上工作的程序员可能都擅长shell脚本编程.但大家解决问题的方式却不尽相同,这要取决于对专业知识的掌握程度.使用命令 的种类.看待问题的方式等等.对于那些处在shell脚本 ...

  3. 关于 shell 脚本编程的10 个最佳实践

    每一个在UNIX/Linux上工作的程序员可能都擅长Shell脚 本编程.但大家解决问题的方式却不尽相同,这要取决于对专业知识的掌握程度.使用命令的种类.看待问题的方式等等.对于那些处在shell脚本 ...

  4. 嵌入式 Linux 入门(五、Shell 脚本编程上:认识 Shell 脚本)

    大家好,是矜辰所致,嵌入式 Linux入 门第五课,本课开始简单学习一下 Shell 脚本编程. 目录 前言 一.Shell 脚本基础说明 1.1 什么是 Shell 脚本 1.2 Shell 脚本的 ...

  5. php shell脚本怎么写,Shell脚本编程入门

    一.什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do tou ...

  6. 超详细shell脚本编程快速入门

    文章目录 1.shell简介 1.1 什么是shell 1.2 shell脚本 1.3 运行shell脚本 1.4 shell注释 1.5 shell编写的基本步骤 2.shell变量 2.1 命名变 ...

  7. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---10

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: 转载于:https://www.cnbl ...

  8. 《Linux命令行与shell脚本编程大全 第3版》创建实用的脚本---10

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: 转载于:https://www.cnbl ...

  9. 如何快速入手 Shell 脚本编程

    Linux Shell 脚本编程之前一直没有系统的去学习,在写 Shell 脚本的时候总需要现查各种语法.本文章以编程语言的维度去系统的学习 Shell 脚本编程. Shell Linux Shell ...

  10. 10分钟入门 ANSA API

      扫描下方二维码关注我的微信公众号 - CAE软件二次开发Lab阅读全文! 文章目录 10分钟入门 ANSA API Script Editor (脚本编辑器) Modules(模块) 在ANSA中 ...

最新文章

  1. 05、HttpServletRequest
  2. ZOJ 3471 压缩状态DP
  3. 2017CCPC 杭州 J. Master of GCD【差分标记/线段树/GCD】
  4. 工作激发了我的热情,并不断激励着我” - SAP成都研究院Jerry Wang
  5. 字符串常量与字符串变量
  6. 纪中A组模拟赛总结(2021.7.17)
  7. java栈编程题_Java实现栈和队列面试题
  8. 线性动态电路的复频域分析
  9. 请注意,我们要谈谈神经网络的注意机制和使用方法
  10. 在Azure Data Studio中探索SandDance可视化扩展
  11. python的设计哲学是什么意思_Python彩蛋:哲学理念及设计思想(The Zen of Python, by Tim Peters)...
  12. EasyCVR通过国标GB28181协议接入设备,出现设备自动拉流是什么原因?
  13. python分位数回归模型_分位数回归及其Python源码导读
  14. SpringBoot系列之集成EasyExcel导入合并行数据
  15. Spring Boot中使用JUnit5进行单元测试
  16. python读书心得体会范文_读书心得体会范文5篇
  17. ROS基础(三)——订阅者Subscriber编程实现
  18. 基于matlab的电流滞环控制,电流滞环控制matlab
  19. 有效使用计算机的,有效的电脑学习方法
  20. java什么叫一致性,Java 中的相等性和一致性

热门文章

  1. linux 清除安装失败的文件夹,恢复Linux误删除文件系列之foremost安装工具使用方法...
  2. 图书馆占座系统(三)
  3. 技术分享——SSM图书馆预约占座系统
  4. 学生信息管理系统课程设计 java_java课程设计(学生信息管理系统)
  5. cad帧数测试软件,怎样让cad运行速度更快_cad如何设置运行更流畅
  6. 《信号与线性系统分析(第五版)》吴大正主编 勘误
  7. Android端直播系统开发入门
  8. python31001python3_Python310第二个alpha版本最新特性值得关注Python 3100a0 文档
  9. VS2017下载安装
  10. 社交系统中用户好友关系数据库设计