您的位置:首页 > 运维架构 > Shell

SHELL 基础知识

2019-03-31 22:46 477 查看

SHELL 基础知识
#!/bin/bash
echo ‘1’

echo ‘2’ # 这一行就表示注释

echo ‘3’
多行注释:
多行注释有两种方法::<<! … ! 和 :<<字符 … 字符
#!/bin/bash
echo ‘1’
:<<! echo ‘2’
echo ‘3’
echo ‘4’
!
echo ‘5’
Shell脚本的执行通常可以采用以下几种方式

bash /path/to/script-name 或 /bin/bash /path/to/script-name (强烈推荐使用)
/path/to/script-name 或 ./script-name (当前路径下执行脚本)
source script-name 或 . script-name (注意“.“点号)

vim pyhello
脚本内容
#!/usr/bin/python3.5
print(‘hello world’)
添加权限
chmod +x pyhello
执行脚本
./pyhello

执行说明:
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 本地变量
本地变量是什么?
本地变量就是:在当前系统的某个环境下才能生效的变量,作用范围小。
本地变量包含两种:普通变量和命令变量

普通变量:
普通变量的定义方式有如下三种,接下来我们就分别说一下这三种方式:

方式一:
变量名=变量值
重点:
变量值必须是一个整体,中间没有特殊字符
方式二:
变量名=‘变量值’
重点:
我看到的内容,我就输出什么内容
方式三:
变量名=“变量值”
重点:
如果变量值范围内,有可以解析的变量A,那么首先解析变量A,将A的结果和其他内容组合成一个整体,重新赋值给变量B

习惯:
数字不加引号,其他默认加双引号

命令变量(熟练)
命令变量有两种定义方式,接下来我们就来介绍一下这两种方式

定义方式一:
变量名=

命令

注意:
` 是反引号

定义方式二:
变量名=$(命令)

执行流程:
1、执行`或者$()范围内的命令
2、将命令执行后的结果,赋值给新的变量名A

2.2.3 全局变量
全局变量是什么
全局变量就是:在当前系统的所有环境下都能生效的变量。

查看全局变量命令
可以通过命令查看环境变量
env 只显示全局变量

定义全局变量
方法一:
变量=值
export 变量
方法二:(最常用)
export 变量=值

2.2.4 变量查看和取消
查看变量:
方式一:
变量名场景:私下里,在命令行/脚本中使用图省事方式二:&quot;变量名 场景: 私下里,在命令行/脚本中使用 图省事 方式二: &quot;变量名场景:私下里,在命令行/脚本中使用图省事方式二:"变量名"
场景:
私下里,在命令行/脚本中使用
图省事
方式三:
${变量名}
场景:
echo " dsa dsafsa dsafsa 变量名f&quot;使用频率较高方式四:&quot;{变量名} f &quot; 使用频率较高 方式四: &quot;变量名f"使用频率较高方式四:"{变量名}"
场景:
标准使用方式

取消变量
unset 变量名

2.2.5 shell内置变量
我们之前学习的本地变量,全局变量都是需要通过定义,然后才能实现相应功能的,那么有没有一些变量我们可以直接拿过来使用实现某种具体的功能呢?有,这就是shell内置变量
和脚本文件有关
符号 意义
$0 获取当前执行的shell脚本文件名,包括脚本路径
n获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大括号括起来n 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大 括号括起来n获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大括号括起来{10}
$# 获取当前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

字符串精确截取
格式:${变量名:起始位置:截取长度}

示例:
${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个字符

默认值相关
场景一:
变量a如果有内容,那么就输出a的变量值
变量a如果没有内容,那么就输出默认的内容

格式:
${变量名:-默认值}

套餐示例:
如果我输入的参数为空,那么输出内容是 "您选择的套餐是: 套餐 1"
如果我输入的参数为n,那么输出内容是 "您选择的套餐是: 套餐 n"

#!/bin/bash

套餐选择演示

a="$1"
echo “您选择的套餐是: 套餐 ${a:-1}”

场景二:
无论变量a是否有内容,都输出默认值
格式:
${变量名+默认值}
场景示例:
不管我说国家法定结婚年龄是 多少岁,都输出 国家法定结婚年龄(男性)是 22 岁
#!/bin/bash

默认值演示示例二

a="$1"
echo "国家法定结婚年龄(男性)是 a+22岁&quot;3.1.1测试语句Shell环境根据命令执行后的返回状态值({a+22} 岁&quot; 3.1.1 测试语句 Shell环境根据命令执行后的返回状态值(a+22岁"3.1.1测试语句Shell环境根据命令执行后的返回状态值(?)来判断是否执行成功,当返回值为0,表示成功,值为其他时,表示失败。使用专门的测试工具—test命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值0为成立)

测试语句形式
A: test 条件表达式
B: [ 条件表达式 ]
格式注意:
以上两种方法的作用完全一样,后者为常用。
但后者需要注意方括号[、]与条件表达式之间至少有一个空格。
test跟 [] 的意思一样
条件成立,状态返回值是0
条件不成立,状态返回值是1

操作注意:
[]两侧为什么要有空格
root@ubuntu:~# [1 = 1 ]
[1: command not found
可以看到:
两侧没有空格,就会报错,为什么呢?因为你不合规范

3.1.2 条件表达式
我们这部分内容主要是介绍,测试语句中的 [ 条件表达式 ] 这一部分,测试的结果使用 echo $? 来查看

逻辑表达式
逻辑表达式一般用于判断多个条件之间的依赖关系。
常见的逻辑表达式有: && 和 ||

&&
命令1 && 命令2
如果命令1执行成功,那么我才执行命令2 – 夫唱妇随
如果命令1执行失败,那么命令2也不执行
示例:

[ 1 = 1 ] && echo “条件成立”

条件成立

[ 1 = 2 ] && echo “条件成立”

||
命令1 || 命令2
如果命令1执行成功,那么命令2不执行 – 对着干
如果命令1执行失败,那么命令2执行
示例:

[ 1 = 2 ] || echo “条件不成立”

条件不成立

[ 1 = 1 ] || echo “条件不成立”

文件表达式

-f 判断输入内容是否是一个文件
示例:

[ -f weizhi.sh ] && echo “是一个文件”

是一个文件

[ -f weizhi.sddh ] || echo “不是一个文件”

不是一个文件

-d 判断输入内容是否是一个目录
示例:

[ -d weizhi.sddh ] || echo “不是一个目录”

不是一个目录

mkdir nihao

[ -d nihao ] && echo “是一个目录”

是一个目录

-x 判断输入内容是否可执行
示例:

[ -x age.sh ] || echo “文件没有执行权限”

文件没有执行权限

[ -x test.sh ] && echo “文件有执行权限”

文件有执行权限

数值操作符

主要根据给定的两个值,判断第一个与第二个数的关系,如是否大于、小于、等于第二个数。常见选项如下:
n1 -eq n2 相等
n1 -gt n2 大于
n1 -ge n2 大于等于
n1 -lt n2 小于
n1 -le n2 小于等于
n1 -ne n2 不等于

字符串比较

str1 == str2 str1和str2字符串内容一致
str1 != str2 str1和str2字符串内容不一致,!表示相反的意思
实践
判断字符是否内容一致
root@ubuntu:~# [ a == a ]
root@ubuntu:~# echo $?
0
root@ubuntu:~# [ a != a ]
root@ubuntu:~# echo $?
1

3.1.3 计算表达式
定义:
计算表达式,简单来说就是对具体的内容进行算数计算

格式:
方式一:
$(()) $(( 计算表达式 ))
方式二:
let let 计算表达式

注意:
$(())中只能用±*/和()运算符,并且只能做整数运算

(())演示效果格式:a=(())演示效果 格式:a=(())演示效果格式:a=((变量名a+1))
注意:
表达式范围内,空格不限制
计算示例
root@ubuntu:~# echo $((100/5))
20

let演示效果
格式:let 变量名a=变量名a+1
注意:
表达式必须是一个整体,中间不能出现空格等特殊字符
let示例
root@ubuntu:~# i=1
root@ubuntu:~# let i=i+7
root@ubuntu:~# echo $i
8
3.2.1 重定向符号
在shell脚本中有两种常见的重定向符号 > 和 >>

符号
作用:
表示将符号左侧的内容,以覆盖的方式输入到右侧文件中
演示:
查看文件内容
admin-1@ubuntu:~$ cat file.txt
nihao
使用重定向符号给文件中增加内容
admin-1@ubuntu:~$ echo “file1.txt” > file.txt
再次查看文件内容
admin-1@ubuntu:~$ cat file.txt
file1.txt

符号
作用:

表示将符号左侧的内容,以追加的方式输入到右侧文件的末尾行中
演示:
查看文件内容
admin-1@ubuntu:~$ cat file.txt
file1.txt
使用重定向符号给文件中增加内容
admin-1@ubuntu:~$ echo “file2.txt” >> file.txt
再次查看文件内容
admin-1@ubuntu:~$ cat file.txt
file1.txt
file2.txt

3.2.2 管道符 |
定义:
| 这个就是管道符,传递信息使用的

使用格式:
命令1 | 命令2
管道符左侧命令1 执行后的结果,传递给管道符右侧的命令2使用

命令演示:
查看当前系统中的全局变量SHELL
admin-1@ubuntu:~$ env | grep SHELL
SHELL=/bin/bash

3.2.3 其他符号
后台展示符号 &
定义:
& 就是将一个命令从前台转到后台执行
使用格式:
命令 &
命令演示:
admin-1@ubuntu:~# sleep 4
界面卡住4秒后消失
admin-1@ubuntu:~# sleep 10 &
[1] 4198
admin-1@ubuntu:~# ps aux | grep sleep
root 4198 0.0 0.0 9032 808 pts/17 S 21:58 0:00 sleep 10
root 4200 0.0 0.0 15964 944 pts/17 S+ 21:58 0:00 grep --color=auto sleep

Ctrl+Z 让当前任务转入到后台并停止
jobs 查看后台任务
fg 让后台进程转入到前台执行
bg 让后台停止的任务继续在后台执行

全部信息符号 2>&1
符号详解:
1 表示正确输出的信息
2 表示错误输出的信息
2>&1 代表所有输出的信息
符号示例
标准正确输出示例
cat nihao.txt 1>> zhengque
标准错误输出示例
dsfadsfadsfa 2>> errfile

综合演练示例
脚本内容
#!/bin/bash
echo ‘下一条错误命令’
dsfsafsafdsa
脚本执行效果
admin-1@ubuntu:~# bash ceshi.sh
下一条错误命令
ceshi.sh: line 3: dsfsafsafdsa: command not found
1 和 2 综合演练
admin-1@ubuntu:~# bash ceshi.sh 1>> ceshi-ok 2>> ceshi-err
admin-1@ubuntu:~# cat ceshi-ok
下一条错误命令
admin-1@ubuntu:~# cat ceshi-err
ceshi.sh: line 3: dsfsafsafdsa: command not found
全部信息演练
admin-1@ubuntu:~# bash ceshi.sh >> ceshi-all 2>&1
admin-1@ubuntu:~# cat ceshi-all
下一条错误命令
ceshi.sh: line 3: dsfsafsafdsa: command not found

linux系统垃圾桶
/dev/null 是linux下的一个设备文件,
这个文件类似于一个垃圾桶,特点是:容量无限大

3.3 常见命令详解
接下来我们介绍一些shell脚本中经常使用的linux命令:grep、sed、awk、find
3.3.1 grep命令详解
grep命令是我们常用的一个强大的文本搜索命令。
命令格式详解
grep [参数] [关键字] <文件名>
注意:
我们在查看某个文件的内容的时候,是需要有<文件名>
grep命令在结合|(管道符)使用的情况下,后面的<文件名>是没有的
可以通过 grep --help 查看grep的帮助信息
参数详解
-c:只输出匹配行的计数。
-n:显示匹配行及行号。
-v:显示不包含匹配文本的所有行。
-i:不区分大小写。

模板文件
admin-1@ubuntu:~$ cat find.txt
nihao aaa
nihao AAA
NiHao bbb
nihao CCC
-c: 输出匹配到aaa的个数
admin-1@ubuntu:~$ grep -c aaa find.txt
1
-n: 输出匹配内容,同时显示行号
admin-1@ubuntu:~$ grep -n CCC find.txt
4:nihao CCC
-v: 匹配到的内容部输出,输出不匹配的内容
admin-1@ubuntu:~$ grep -v ni find.txt
NiHao bbb
小技巧:
精确定位错误代码
grep -nr [错误关键字] *

3.3.2 sed命令详解
sed 行文件编辑工具。因为它编辑文件是以行为单位的。
命令格式详解

命令格式:
sed [参数] ‘<匹配条件> [动作]’ [文件名]
注意:
可以通过 sed --help 查看grep的帮助信息
参数详解:
参数为空 表示sed的操作效果,实际上不对文件进行编辑
-i 表示对文件进行编辑
注意:mac版本的bash中使用 -i参数,必须在后面单独加个东西: -i ‘’

匹配条件:
匹配条件分为两种:数字行号或者关键字匹配
关键字匹配格式:
‘/关键字/’
注意:
隔离符号 / 可以更换成 @、#、!等符号
根据情况使用,如果关键字和隔离符号有冲突,就更换成其他的符号即可。

动作详解
-a 在匹配到的内容下一行增加内容
-i 在匹配到的内容上一行增加内容
-d 删除匹配到的内容
-s 替换匹配到的内容
注意:
上面的动作应该在参数为-i的时候使用,不然的话不会有效果
替换命令演示
关于替换,我们从三个方面来学习:
行号、列号、全体
命令格式:
sed -i [替换格式] [文件名]
注意:替换命令的写法
‘s###’ —> ‘s#原内容##’ —> ‘s#原内容#替换后内容#’

常见替换格式:
模板文件内容
admin-1@ubuntu:~$ cat sed.txt
nihao sed sed sed
nihao sed sed sed
nihao sed sed sed

替换每行首个匹配内容:
sed -i ‘s#原内容#替换后内容#’ 文件名

示例:替换首每行的第1个sed为SED
admin-1@ubuntu:~$ sed -i ‘s#sed#SED#’ sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED sed sed
nihao SED sed sed
nihao SED sed sed

替换全部匹配内容:
sed -i ‘s#原内容#替换后内容#g’ 文件名

示例:替换全部sed为des
admin-1@ubuntu:~$ sed -i ‘s#sed#SED#g’ sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED SED SED
nihao SED SED SED
nihao SED SED SED

指定行号替换首个匹配内容:
sed -i ‘行号s#原内容#替换后内容#’ 文件名

示例:替换第2行的首个SED为sed
admin-1@ubuntu:~$ sed -i ‘2s#SED#sed#’ sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED SED SED
nihao sed SED SED
nihao SED SED SED

首行指定列号替换匹配内容:
sed -i ‘s#原内容#替换后内容#列号’ 文件名

示例:替换每行的第2个SED为sed
admin-1@ubuntu:~$ sed -i ‘s#SED#sed#2’ sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED sed SED
nihao sed SED sed
nihao SED sed SED

指定行号列号匹配内容:
sed -i ‘行号s#原内容#替换后内容#列号’ 文件名

示例:替换第3行的第2个SED为sed
admin-1@ubuntu:~$ sed -i ‘3s#SED#sed#2’ sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED sed SED
nihao sed SED sed
nihao SED sed sed
替换mysql配置文件my.cnf
[client]
user=root
示例:
sed ‘/user=/s#=.*#=zhangsan#’ my.ini
替换变量内容
filename=hello.jpg
filename=$(echo $filename | sed ‘s/.jpg/.png/’)
echo $filename

增加操作

作用:
在指定行号的下一行增加内容
格式:
sed -i ‘行号a\增加的内容’ 文件名
注意:
如果增加多行,可以在行号位置写个范围值,彼此间使用逗号隔开,例如
sed -i ‘1,3a\增加内容’ 文件名

演示效果:
指定行号增加内容
admin-1@ubuntu:~$ sed -i ‘2a\zengjia-2’ sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED sed SED
nihao sed SED sed
zengjia-2
nihao SED sed sed
指定1~3每行都增加内容
admin-1@ubuntu:~$ sed -i ‘1,3a\tongshi-2’ sed.txt
admin-1@ubuntu:~$ cat sed.txt
nihao SED sed SED
tongshi-2
nihao sed SED sed
tongshi-2
zengjia-2
tongshi-2
nihao SED sed sed

作用:
在指定行号的当行增加内容
格式:
sed -i ‘行号i\增加的内容’ 文件名
注意:
如果增加多行,可以在行号位置写个范围值,彼此间使用逗号隔开,例如
sed -i ‘1,3a\增加内容’ 文件名

演示效果:
指定行号增加内容
admin-1@ubuntu:~$ sed -i ‘1i\insert-1’ sed.txt
admin-1@ubuntu:~$ cat sed.txt
insert-1
nihao SED sed SED
tongshi-2
nihao sed SED sed
tongshi-2
zengjia-2
tongshi-2
nihao SED sed sed

删除操作

作用:
指定行号删除
格式:
sed -i ‘行号d’ 文件名
注意:
如果删除多行,可以在行号位置多写几个行号,彼此间使用逗号隔开,例如
sed -i ‘1,3d’ 文件名

删除演练
删除第4行内容
admin-1@ubuntu:~$ sed -i ‘4d’ sed.txt
admin-1@ubuntu:~$ cat sed.txt
insert-1
nihao SED sed SED
tongshi-2
tongshi-2
zengjia-2
tongshi-2
nihao SED sed sed

删除多行(3-5行)内容
admin-1@ubuntu:~$ sed -i ‘3,5d’ sed.txt
admin-1@ubuntu:~$ cat sed.txt
insert-1
nihao SED sed SED
tongshi-2
nihao SED sed sed

3.3.3 awk命令详解
awk是一个功能非常强大的文档编辑工具,它不仅能以行为单位还能以列为单位处理文件。
命令格式:
awk [参数] ‘[ 动作]’ [文件名]

常见参数:
-F 指定行的分隔符

常见动作:
print 显示内容
$0 显示当前行所有内容
n显示当前行的第n列内容,如果存在多个n 显示当前行的第n列内容,如果存在多个n显示当前行的第n列内容,如果存在多个n,它们之间使用逗号(,)隔开

常见内置变量
FILENAME 当前输入文件的文件名,该变量是只读的
NR 指定显示行的行号
NF 输出 最后一列的内容
OFS 输出格式的列分隔符,缺省是空格
FS 输入文件的列分融符,缺省是连续的空格和Tab

命令演示
模板文件内容
admin-1@ubuntu:~$ cat awk.txt
nihao awk awk awk
nihao awk awk awk

打印指定列内容
打印第1列的内容
admin-1@ubuntu:~$ awk ‘{print $1}’ awk.txt
nihao
nihao

指定行打印内容
打印第一行第1和第3列内容
admin-1@ubuntu:~$ awk ‘NR==1 {print $1,$3}’ awk.txt
nihao awk

指定隔离分隔符,查看内容
admin-1@ubuntu:~$ cat linshi.txt
root❌0:0:root:/root:/bin/bash
admin-1@ubuntu:~$ awk -F ‘:’ ‘{print $1,$7}’ linshi.txt
root /bin/bash

设置显示分隔符,显示内容
admin-1@ubuntu:~$ awk ‘BEGIN{OFS=":"} {print NR,$0}’ awk.txt
1:nihao awk awk awk
2:nihao awk awk awk
3.3.4 find命令详解
命令格式:
find [路径] [参数] [关键字]
参数详解
-name 按照文件名查找文件。
-perm 按照文件权限来查找文件。
-user 按照文件属主来查找文件。
-group 按照文件所属的组来查找文件。
-type 查找某一类型的文件,
诸如:
b - 块设备文件 d - 目录 c - 字符设备文件
p - 管道文件 l - 符号链接文件 f - 普通文件。
-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-mindepth n:在查找文件时,查找当前目录中的第n层目录的文件,然后再在其子目录中查找。
! : 表示取反

命令演示
在当前系统中查找一个叫awk的文件
admin-1@ubuntu:~$ sudo find /home/admin-1/ -name “awk.txt”
/home/admin-1/awk.txt
在当前系统中查找文件类型为普通文件的文件
admin-1@ubuntu:~$ find /tmp -type f
/tmp/.X0-lock
/tmp/vgauthsvclog.txt.0
/tmp/unity_support_test.0
/tmp/config-err-4igbXW

第4章 流程控制
在shell的语句中,流程控制主要分为两种:
简单流程控制语句:选择和循环
复杂流程控制语句:函数
4.1 简单流程控制语句
4.1.1 单分支if语句
语法格式
if [ 条件 ]
then
指令
fi

场景:
单一条件,只有一个输出

单分支if语句示例
#!/bin/bash

单if语句的使用场景

if [ “$1” == “nan” ]
then
echo “您的性别是 男”
fi

4.1.2 双分支if语句
语法格式
if [ 条件 ]
then
指令1
else
指令2
fi
场景:
一个条件,两种结果

双分支if语句示例
#!/bin/bash

单if语句的使用场景

if [ “$1” == “nan” ]
then
echo “您的性别是 男”
else
echo “您的性别是 女”
fi
4.1.3 多分支if语句
语法格式
if [ 条件 ]
then
指令1
elif [ 条件2 ]
then
指令2
else
指令3
fi
场景:
n个条件,n+1个结果

多分支if语句示例
#!/bin/bash

单if语句的使用场景

if [ “$1” == “nan” ]
then
echo “您的性别是 男”
elif [ “$1” == “nv” ]
then
echo “您的性别是 女”
else
echo “您的性别,我不知道”
fi

多if语句生产场景: 服务的启动
需求:
要求脚本执行需要有参数,通过传入参数来实现不同的功能。

参数和功能详情如下:
参数 执行效果
start 服务启动中…
stop 服务关闭中…
restart 服务重启中…
* 脚本 X.sh 使用方式 X.sh [ start|stop|restart ]

脚本内容
admin-1@ubuntu:/data/scripts/python-n# cat if.sh
#!/bin/bash

多if语句的使用场景

if [ “$1” == “start” ]
then
echo “服务启动中…”
elif [ “$1” == “stop” ]
then
echo “服务关闭中…”
elif [ “$1” == “restart” ]
then
echo “服务重启中…”
else
echo “$0 脚本的使用方式: $0 [ start | stop | restart ]”
fi

4.1.4 case选择语句
我们发现多if语句使用的时候,代码量很多,而且整体看起来确实有那么一丁点乱,有没有办法更好的实现这种效果呢?就是Case语句。

case 语句格式
case 变量名 in
值1)
指令1
;;
值2)
指令2
;;
值3)
指令3
;;
esac
注意:
首行关键字是case,末行关键字esac
选择项后面都有 )
每个选择的执行语句结尾都有两个分号;

case语句示例
场景:在多if语句的基础上对脚本进行升级
需求:
要求脚本执行需要有参数,通过传入参数来实现不同的功能。

参数和功能详情如下:
参数 执行效果
start 服务启动中…
stop 服务关闭中…
restart 服务重启中…
* 脚本 X.sh 使用方式 X.sh [ start|stop|restart ]

脚本内容:

cat case.sh

#!/bin/bash

case语句使用场景

case “$1” in
“start”)
echo “服务启动中…”
;;
“stop”)
echo “服务关闭中…”
;;
“restart”)
echo “服务重启中…”
;;
*)
echo “$0 脚本的使用方式: $0 [ start | stop | restart ]”
;;
esac

4.1.5 for循环语句
循环指定的所有元素,循环完毕之后就推出
语法格式
语法格式
for 值 in 列表
do
执行语句
done

场景:
遍历列表

注意:
”for” 循环总是接收 “in” 语句之后的某种类型的字列表
执行次数和list列表中常数或字符串的个数相同,当循环的数量足够了,就自动退出

示例:遍历文件
#!/bin/bash

for语句的使用示例

for i in (ls/root)doecho&quot;(ls /root) do echo &quot;(ls/root)doecho"{i}"
done

4.1.6 while循环语句
语法格式
while 条件
do
执行语句
done
注意:
条件的类型:
命令、[[ 字符串表达式 ]]、(( 数字表达式 ))

场景:
只要条件满足,就一直循环下去

while语句示例
脚本内容
#!/bin/bash

while的示例

a=1
while [ “a&quot;−lt5]doecho&quot;{a}&quot; -lt 5 ] do echo &quot;a"−lt5]doecho"{a}”
a=$((a+1))
done

4.1.7 until循环语句
语法格式
until 条件
do
执行语句
done
注意:
条件的类型:
命令、[[ 字符串表达式 ]]、(( 数字表达式 ))

场景:
只要条件不满足,就一直循环下去

until语句示例
脚本内容
#!/bin/bash

until的示例

a=1
until [ “a&quot;−eq5]doecho&quot;{a}&quot; -eq 5 ] do echo &quot;a"−eq5]doecho"{a}”
a=$((a+1))
done

4.2 复杂流程控制语句
函数就是我们的复杂流程控制语句
4.2.1 函数基础知识
函数是什么?
函数就是将某些命令组合起来实现某一特殊功能的方式,是脚本编写中非常重要的一部分。
简单函数格式:
定义函数:
函数名(){
函数体
}
调用函数:
函数名

传参函数格式:
传参数
函数名 参数
函数体调用参数:
函数名(){
函数体 $n
}
注意:
类似于shell内置变量中的位置参数
4.2.2 函数实践
简单函数定义和调用示例
#!/bin/bash

函数使用场景一:执行频繁的命令

dayin(){
echo “wo de mingzi shi 111”
}
dayin

函数传参和函数体内调用参数示例
#!/bin/bash

函数的使用场景二

dayin(){
echo “wo de mingzi shi $1”
}
dayin 111

函数调用脚本传参
#!/bin/bash

函数传参演示

定义传参数函数

dayin(){
echo “wode mignzi shi $1”
}

函数传参

dayin $1
脚本传多参,函数分别调用示例
#!/bin/bash

函数的使用场景二

dayin(){
echo “wo de mingzi shi $1”
echo “wo de mingzi shi $2”
echo “wo de mingzi shi $3”
}
dayin 111 df dfs

4.3 第一阶段综合案例
需求
1、zonghe.sh 脚本执行时候需要添加参数才能执行
参数和功能详情如下:
参数 执行效果
start 服务启动中…
stop 服务关闭中…
restart 服务重启中…
* 脚本帮助信息…
2、参数的数量有限制,只能是1个,多余一个会提示脚本的帮助信息
3、帮助信息使用函数来实现
信息内容:脚本 zonghe.sh 使用方式 zonghe.sh [ start|stop|restart ]
知识点分析:
1、zonghe.sh 脚本执行时候需要添加参数才能执行
脚本传参、case语句
2、参数的数量有限制,只能是1个,多余一个会提示脚本的帮助信息
参数数量、条件表达式(验证+数字)、if语句
3、帮助信息使用函数来实现
函数定义+调用
4、if语句和case语句嵌套
if语句在外,case语句在内
脚本编写流程:
1、先写主流程框架
2、完善函数功能
3、完善需求功能
代码实践
#!/bin/bash

定义本地变量

arg="$1"

脚本帮助信息

usage(){
echo “脚本 $0 的使用方式是: $0 [ start|stop|restart ]”
}

函数主框架

if [ KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲ -eq 1 ] then …{arg}" in
start)
echo “服务启动中…”
;;
stop)
echo “服务关闭中…”
;;
restart)
echo “服务重启中…”
;;
*)
usage
;;
esac
else
usage
fi

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: