自动化运维--Shell篇(2)
2. Shell基础知识
2.1 Shell脚本
我们在上面第1章简单介绍了一下什么是shell脚本,现在我们来进一步的来介绍shell脚本的要求/格式/规范等内容
2.1.1 创建脚本
脚本创建工具: 创建脚本的常见编辑器是 vi/vim.
脚本命名: shell脚本的命名简单来说就是要有意义,方便我们通过脚本名,来知道这个文件是干什么用的。
脚本内容: 各种可以执行(成功的)的命令。
注释内容:
<1>. 单行注释:
除了首行的#不是注释外,其他所有行内容,只要首个字符是#, 那么就表示该行是注释。
#!/bin/bash
echo '1'
# echo '2' # 这一行就表示注释
echo '3'
<2>. 多行注释:
多行注释有两种方法::<<! ... !
和 :<<字符 ... 字符
(如 :<<a ..... a
也是可以的)
#!/bin/bash
echo '1'
:<<! echo '2'
echo '3'
echo '4'
!
echo '5'
具体演示:
第一种注释:
第二种注释:
2.1.2 脚本执行
Shell脚本的执行通常可以采用以下几种方式:
方式一:【bash 相对路径(或者绝对路径)/文件名 ,推荐使用绝对路径】
bash(相对路径) /path/to/script-name.sh
或:
/bin/bash(绝对路径) /path/to/script-name.sh
(强烈推荐使用)
方式二:【需要给脚本文件添加可执行权限: chmod +x 文件名 】
/path/to/script-name.sh(绝对路径)
或:
./script-name.sh(相对路径)
(当前路径下执行脚本)
方式三:【. 就相当于 source ./script-name.sh 也是可以的】
source script-name.sh
或:
. script-name.sh
(注意“.“点号)
执行说明:
1、脚本文件本身没有可执行权限或者脚本首行没有命令解释器时使用的方法,我们推荐用bash执行。 [使用频率:☆☆☆☆☆]
2、脚本文件具有可执行权限时使用。 [使用频率:☆☆☆☆]
3、使用source或者.点号,加载shell脚本文件内容,使shell脚本内容环境和当前用户环境一致。 【使用场景:环境一致性】[使用频率:☆☆☆]
2.1.2 脚本开发规范
-
1、脚本命名要有意义,文件后缀是.sh
-
2、脚本文件首行是而且必须是脚本解释器: #!/bin/bash
-
3、脚本文件解释器后面要有脚本的基本信息等内容
- 脚本文件中尽量不用中文注释; 尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰。
- 常见的注释信息:脚本名称、脚本功能描述、脚本版本、脚本作者、联系方式等
-
4、脚本文件常见执行方式:bash 脚本名
-
5、脚本内容执行:从上到下,依次执行
-
6、代码书写优秀习惯:
1)成对内容的一次性写出来,防止遗漏。如:()、{}、[ ]、''、``、""
2)[ ] 中括号两端要有空格,书写时即可留出空格 [ ],然后再退格书写内容。
3)流程控制语句一次性书写完,再添加内容。 -
7、通过缩进让代码易读;(即该有空格的地方就要有空格)
2.2 变量
变量的学习我们主要从四个方面来学习:
变量的定义和分类: 本地变量、 全局变量、 shell内置变量
2.2.1 什么是变量
变量是什么? 我们一般所说的变量指的是:变量名
变量包括两部分:
-
变量名 -->> 不变的
-
变量值 -->> 变化的
2.2.2 本地变量
本地变量是什么? 本地变量就是:在当前系统的某个环境下才能生效的变量,作用范围小。
本地变量包含两种:普通变量、命令变量
(1). 普通变量:
普通变量的定义方式有如下三种,接下来我们就分别说一下这三种方式:
方式一:变量名=变量值
重点:变量值必须是一个整体,中间没有特殊字符,不能有空格!!!(空格也是特殊字符)
方式二: 变量名='变量值'
重点: 我看到什么内容,我就输出什么内容。
方式三: 变量名="变量值"
重点: 如果变量值范围内,有可以解析的变量A,那么首先解析变量A,将A的结果和其他内容组合成一个整体,重新赋值给变量B。
没有引号与有引号的区别演示:
单引号与双引号的区别演示: 【单引号中的就是字符串,而双引号中的可以解析出变量值】
习惯: 数字不加引号,其他默认加双引号
$说明:
(2). 命令变量:
命令变量有两种定义方式,接下来我们就来介绍一下这两种方式。
定义方式一:
变量名=`命令`
注意:` 是反引号
定义方式二:【推荐使用】
变量名=$(命令)
执行流程:
1、执行 ` 或者 $() 范围内的命令
2、将命令执行后的结果,赋值给新的变量名A
演示:
第一种方式:
注意: 这里的pwd是一个命令变量. 他代表的是当前目录.
第二种方式:
2.2.3 全局变量
全局变量是什么? 全局变量就是:在当前系统的所有环境下都能生效的变量。
查看全局变量命令: env :只显示全局变量
演示:
这个SHELL其实就是一个全局变量.
我们通过env
查看所有全局变量:
定义全局变量
方法一:
变量=值
export 变量
方法二:(最常用)
export 变量=值
演示:
方式一:
方式二: 【grep从管道中查询 包含’ITCAST’的所有全局变量】
2.2.4 变量查看和取消
查看变量:
方式一: $变量名
场景:私下里,在命令行/脚本中使用,图省事。
方式二: "$变量名"
场景:私下里,在命令行/脚本中使用,图省事。
方式三:${变量名}
eg:echo " dsa dsafsa dsafsa ${变量名} f "
场景:使用频率较高
方式四:"${变量名}"
场景:标准使用方式。
演示:
取消变量: unset 变量名
演示:
删除全局变量:
删除局部变量:
2.2.5 shell内置变量
我们之前学习的本地变量,全局变量都是需要通过定义,然后才能实现相应功能的,那么有没有一些变量我们可以直接拿过来使用实现某种具体的功能呢?有,这就是shell内置变量。
和脚本文件有关
当n为0时表示脚本的文件名,如果n大于9就要用大括号括起来${10}
$# 获取当前shell命令行中参数的总个数
$? 获取执行上一个指令的返回值(0为成功,非0为失败)
符号 | 意义 |
---|---|
$0 | 获取当前执行的shell脚本文件名,包括脚本路径 |
$n | 获取当前执行的shell脚本的第n个参数值,n=1..9, |
当n为0时表示脚本的文件名,如果n大于9就要用大括号括起来$ | |
$# | 获取当前shell命令行中参数的总个数 |
$? | 获取执行上一个指令的返回值(0为成功,非0为失败) |
重点内置变量演示效果:
$0 获取脚本的名称
示例:
#!/bin/bash
# 获取脚本的名称
echo "我脚本的名称是: file.sh"
echo "我脚本的名称是:$0"
演示:
$n 获取当前脚本传入的第n个位置的参数
示例:
#!/bin/bash
# 获取当前脚本传入的参数数量
echo "当前脚本传入的参数数量是: $#"
# 获取指定位置的参数
echo "第一个位置的参数是: $1"
echo "第二个位置的参数是: $2"
echo "第三个位置的参数是: $3"
echo "第四个位置的参数是: $4"
演示:
增加多个参数:
$# 获取当前脚本传入参数的数量
演示:
$? 获取文件执行或者命令执行的返回状态值
示例:
# bash nihao
bash: nihao: No such file or directory
# echo $?
127
# ls
file1.sh num.sh test.sh weizhi.sh
# echo $?
0
演示:
127代表:非零; 0代表执行成功。
2.3 字符串精确截取
字符串精确截取,格式:${变量名:起始位置:截取长度}
示例:
| ------------- | ----------------------------------- |
|${file:0:5} | 从第1个字符开始,截取5个字符 |
|${file::5} | 从第1个字符开始,截取5个字符 |
|${file:5:5} | 从第6个字符开始,截取5个字符 |
|${file:5} | 从第6个字符开始,截取后面所有的字符 |
|${file:0-5} | 从倒数第5个字符开始,截取后面所有的字符 |
|${file:0-6:3} | 从倒数第6个字符开始,截取之后的3个字符 |
| ------------- | ----------------------------------- |
演示:
2.4 默认值
场景一:
变量a如果有内容,那么就输出a的变量值;
变量a如果没有内容,那么就输出默认的内容。
格式: ${变量名:-默认值}
套餐示例:
如果我输入的参数为空,那么输出内容是 "您选择的套餐是: 套餐 1"
如果我输入的参数为n, 那么输出内容是 "您选择的套餐是: 套餐 n"
演示:
场景二:
无论变量a是否有内容,都输出默认值
格式: ${变量名+默认值}
场景示例:
不管我说国家法定结婚年龄是 多少岁,都输出 国家法定结婚年龄(男性)是 22 岁
#!/bin/bash
# 默认值演示示例二
a="$1"
echo "国家法定结婚年龄(男性)是 ${a+22} 岁"
演示:
本文来自博客园,作者:子沐呐吖,转载请注明原文链接:https://www.cnblogs.com/SuperLee017/p/18296396