Shell 编程学习(一)
1.什么是 Shell
shell 是一块包裹着系统核心的壳,处于操作系统的最外层,与用户直接对话,把用户的输入,解释给操作系统,然后处理操作系统的输出结果,输出到屏幕给予用户看到结果。
从我们登录 linux,输入账号密码到进入 Linux 交互式界面,所有的操作,都是交给 shell 解释并执行。
2.Shell 是运维人员必须掌握的技能
2016 年初国内服务器端各个操作系统的市场份额:
正是由于 Linux 服务器的大规模应用,才需要一批专业的人才去管理,这群人就是 Linux 运维工程师(OPS)。
OPS 这项工作的细节内容包括:
安装操作系统,例如 CentOS、Ubuntu 等。
及时修复漏洞,防止服务器被攻击,这包括 Linux 本身漏洞以及各个软件的漏洞。
根据项目需求升级软件,例如 PHP 7.0 在性能方面获得了重大突破,如果现在服务器压力比较大,就可以考虑将旧版的 PHP 5.x 升级到 PHP 7.0。
监控服务器压力,别让服务器宕机。例如淘宝双十一的时候就会瞬间涌入大量用户,导致部分服务器宕机,网页没法访问,甚至连支付宝都不能使用。
分析日志,及时发现代码或者环境的问题,通知相关人员修复。
对于一些常见的系统脚本,使用 Shell 开发会更简单、更快速,例如,让软件一键自动化安装、优化,监控报警脚本,软件启动脚本,日志分析脚本等,虽然 Python 也能做到这些,但是考虑到掌握难度、开发效率、开发习惯等因素,它们可能就不如 Shell 脚本流行以及有优势了。对于一些常见的业务应用,使用 Shell 更符合 Linux 运维简单、易用、高效的三大原则则。
3.什么是 Shell 脚本
当命令或者程序语句写在文件中,我们执行文件,读取其中的代码,这个程序文件就称之为 Shell 脚本。
在 shell 脚本里定义多条 Linux 命令以及循环控制语句,然后将这些 Linux 命令一次性执行完毕,执行脚本文件的方式称之为:非交互式方式。
indows 中存在*.bat 批处理脚本
Linux 中常用*.sh 脚本文件
代码块:
#!/bin/bash : Shebang 指的是出现在文本文件的第一行前两个字符 #!
在 Unix 系统中,程序会分析 shebang 后面的内容,作为解释器的指令,例如:
其中/bin/sh 指向/bin/bash。
4.Shell 命令的基本格式
command [选项] [参数]
[]表示可选的,也就是可有可无。有些命令不写选项和参数也能执行,有些命令在必要的时候可以附带选项和参数
5.运行 Shell 脚本有两种方法:
1、作为可执行程序
将上面的代码保存为 test.sh,并 cd 到相应目录:
注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
2、作为解释器参数
这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:
/bin/sh test.sh
/bin/php test.php
这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。
6. Shell 变量
1)普通变量
赋值:
a="川川帅哥"
打印:
echo $a
2)只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
3)删除变量
c="川川菜鸟"
unset c
echo $c
7、Shell 字符串
1)单双引号
字符串可以用单引号,也可以用双引号,也可以不用引号。
单引号特点:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号特点: - 双引号里可以有变量 - 双引号里可以出现转义字符
注:我们可以理解双引号中,直接引入 $name 变量是可以的,而单引号是不行的;但是双引号和单引号中如果有其他的单引号/双引号包含的 $name 变量,是可以的,理解为字符串拼接。
2)字符串拼接
3)获取字符串长度
在上面的基础之上加上 echo ${#c}即可:
4)字符串提取
a="chuan"
b="chuan"
c=" $a$b"
echo $c
echo ${#c}
echo ${a:1:3} #从索引为 1 的开始,截取长度为 3de
8、Shell 数组
1)读取索引数组
Shell 数组用括号来表示,元素用空格符号分割开。 sh 文件内容为:
a=(A B "C" D)
echo $a
结果:
A
但是你是否在疑惑只输出的第一个,shell 里我们不能像别的语言一样,直接输出全部,因此我们要修改一下。 改为这样:
a=(A B "C" D)
echo ${a[0]}
echo ${a[1]}
echo ${a[2]}
echo ${a[3]}
2)获取数组中的所有元素
如果想一次性全部输出,并不想通过索引来输出怎么办?使用 @ 或 * 可以获取数组中的所有元素,在上面的基础上我再编辑加两行:
3)获取数组的长度
在前面的基础之上加上 #:
echo "數組元素個數爲:${#a[@]}"
echo "數組元素個數爲:${#a[*]}"
9、shell 运算符
算术运算符
演示其中一部分,其它则类似:
注意事项:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
完整的表达式要被 两个反引号 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
乘号(*)前边必须加反斜杠(\)才能实现乘法运算;
if...then...fi 是条件语句,后续将会补充讲解。
10、Shell echo 命令
1)显示普通字符串
echo "hello world"
2)显示转义字符
echo "\"hello world\""
3)显示换行
echo -e "hello\n" #-e 开启转义
4)显示不换行
echo -e "chuan! \c" # -e 开启转义 \c 不换行
5)显示结果重定向至文件
定向至 test7.sh 文件:
echo "hello world" >test7.sh
6)显示执行时间
echo `date`
这里又到了最后了,补充一下 printf 跟 echo 命令是一样的作用,因此我就不演示了,统一用 echo 来输出。
版权声明: 本文为 InfoQ 作者【Studying_swz】的原创文章。
原文链接:【http://xie.infoq.cn/article/657055af0ff09a8616a6cec62】。文章转载请联系作者。
评论