一文教会你写90%的shell脚本!

作者:微信小助手

发布时间:2020-08-30T19:50:14

作者丨匠心Java 
来源丨匠心Java(code-the-world

大家好,我是老C,很开心和大家见面 ~
在公司项目的开发过程中,总会有需要编写shell脚本去处理一个业务的时候,也有的小伙伴总会问我关于shell脚本的一些知识,在这里博主整理了一篇文章
看完这边文章应该就可以独立完成大部分脚本的编写~

shell脚本?

在说什么是shell脚本之前,先说说什么是shell。
shell是外壳的意思,就是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包括ls、cd、pwd等等。总结来说,Shell是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机进行控制。
shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。
shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序。
那么什么是shell脚本呢?
shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。
shell脚本中最重要的就是对shell命令的使用与组合,再使用shell脚本支持的一些语言特性,完成想要的功能。
写shell脚本需要了解什么知识呢?
语法-调试技巧-实战案例,本篇都有,开整~

注释

“# ”开头的就是注释,被编译器忽略
  • 单行注释:#
  • 多行注释::<<eof ...="" eof="" 或者="" :<<!="" !="" (:<<="" 标识多行注释开始,并指定一个标识符作为开始结束的标志)<="" li="" style="box-sizing: border-box;">

变量

变量类型运行shell时,会同时存在三种变量:
  1. 局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  2. 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  3. shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
变量操作
  • 创建普通变量:name="test" (=两边不可有空格)
  • 创建只可函数体中使用的局部变量:local name="test" (使用local修饰的变量在函数体外无法访问,并且local只能在函数体内使用)
  • 使用变量:echo $name 或者 echo ${name} (推荐使用大括号版)
  • 变量重新赋值:name="new_test" (将原值覆盖)
  • 只读变量:name="only_read" -> readonly name (使用readonly标识后的变量,不可被修改)
  • 删除变量:unset name; (删除之后不可访问,删除不掉只读变量)
字符串变量1)单引号
  • 单引号变量 var='test' ,只能原样输出,变量无效
  • 单引号中不能出现一个单独的单引号,转义也不可以
2)双引号
  • 双引号变量 var="my name is ${name}",变量有效
  • 可出现转义符
3)拼接字符串
  • 中间无任何+,之类的字符
  • name="this is"" my name"; name="this is my name"; name="this" is "my name" 等效
  • name='this is'' my nam'; name='this is my name'; name='this' is 'my name' 等效
4)获取字符串长度
  • 在${}中使用“#”获取长度
  • name="test";
  • echo ${#name}; # 输出为4
5)提取子字符串
  • 1:4 从第2个开始 往后截取4个字符
  • ::4 从第一个字符开始 往后截取4个字符
  • name="this is my name";
  • echo ${name:1:4} #输出 is i
  • echo ${name::4} #输出 this
数组
bash只支持一维数组,不支持多维数组
  • 定义数组:array_name=(li wang xiang zhang) (小括号做边界、使用空格分离)
  • 单独定义数组的元素:arraypara[0]="w"; arraypara[3]="s" (定义时下标不连续也可以)
  • 赋值数组元素:array_name[0]="zhao";
  • 获取数组元素:
    • arrayname[0]="li"
    • arrayname[3]="zhang"
    • echo ${arrayname[0]} # 输出"li"
    • echo ${arrayname[1]} # 输出" "
    • echo ${arrayname[3]} # 输出"zhang"