shell脚本进阶
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本进阶相关的知识,希望对你有一定的参考价值。
1.流程控制
shell脚本是一种过程式的编程语言,过程式的编程语言主要分为三种执行方式,分别是顺序执行,选择执行,循环执行,这三种执行方式构建了我们shell脚本的所有内容,我们将依次介绍这三种执行方式。
1.顺序执行
shell脚本中所有命令都是顺序执行的,即使是选择和循环也是顺序执行的,所以不用特别介绍。
2.选择执行
选择执行就是当满足某些特定的条件后,才会执行选择中的语句,选择执行,主要是两种选择方式,分别是if选择执行和case选择执行。
if选择执行:
if支持多层if的嵌套,可以实现多层的选择执行,例如一个简单的if语句:
#!/bin/bash
if [ $1 -ge 0 ];then
if [ $1 lt 9 ];then
echo 这是一个大于等于0并且小于9的数
fi
fi
执行结果如下:
如上,if是if选择的开始,后面是选择条件,然后是;then是固定语法,后面的内容就是当选择条件为真时要执行的语句,fi是选择结束的标志。
当然有些时候会有多种选择,我们可以用elif和else来进行其他的选择,例如一个简单的多个选择:
#!/bin/bash
if[ $1 -eq 0 ];then
echo 等于0
elif[ $1 -eq 1 ];then
echo 等于1
else
echo 非零且非1
fi
我们执行这个脚本,执行结果如下:
if选择执行时,每次只能匹配一个选择分支,如果没有匹配的分支,则不执行,直接退出选择。
case选择执行:
case是另一种选择结构,他对于多条并列的选择分支时,比起if选择结构就简单的多了,case选择也是单一匹配的。我们来看一个简单的case选择:
#!/bin/bash
case $1 in
1)echo 输入的是1;;
2)echo 输入的是2;;
3)echo 输入的是3;;
4)echo 输入的是4;;
esac
执行结果如下:
case选择在这种并列情况下是非常方便的,case代表选择结构开始,然后接的是判断条件,esac是选择结构结束的标志。
3.循环结构
循环结构就是在满足一些条件时,让某些语句循环执行,直到不满足特定条件时结束循环,循环结构主要有以下几种:
for循环
for循环当循环条件为真时循环,当条件为假时结束循环,例如一个简单的for循环:
#!/bin/bash
for i in `seq 1 3`;do
echo $i
echo 第$i次循环
done
执行结果如下:
for循环中for代表循环开始,后面跟的是循环条件,然后中间是循环体,以do开始,done结束。
另一种for循环是将循环条件用(())括起来,中间有三个条件,用;隔开,例如
for ((i=0;i<10;i++));do
echo $i
echo 本次是第$i次循环
done
执行结果如下:
不管哪种循环都能方便进行循环运算,可以看情况选择合适的for循环
while循环
while循环是一种当条件为真时进行循环的循环结构,我们可以看一个简单的while循环:
#!/bin/bash
i=0
while [ $i -lt 5 ];do
echo $i
echo 这是第$i次循环
let i++
done
执行结果如下:
在while循环中while是循环开始的标志,后面接判断条件,如果为真,则开始循环,如果为假,则结束循环,do与done是循环体。
until循环
until循环和while循环相反,他是当条件为假时进入循环,当条件为真时结束循环,我们看一下下面这个例子:
#!/bin/bash
i=0
until [ $i -eq 5 ];do
echo $i
echo 这是第$i次循环
let i++
done
执行结果如下:
在until循环中until是循环开始的标志,后面跟循环条件,如果条件为假,则进入循环,如果条件为真,则结束循环,do和done之间是循环体。
select循环
select能够列出循环内容,他需要一个输入值,并保存在REPLY中,例如
#!/bin/bash
PS3=‘输入季节:‘
select jijie in "春" "夏" " 秋" "冬" "退出";do
case $REPLY in
1)echo 春;;
2)echo 夏;;
3)echo 秋;;
4)echo 冬;;
5) exit ;;
esac
done
执行结果如下:
select代表循环开始,后面接循环条件,他会一直循环下去直到有退出。
2.循环控制命令
break命令
break命令能够直接结束当前循环结构,即是退出循环,例如
#!/bin/bash
for i in `seq 1 3`;do
echo $i
echo 第$i次循环
if [ $i -eq 2 ];then
break
fi
done
执行结果如下:
可以看到当i等于2时,满足了if的条件,然后执行break,当前循环直接结束,不在执行break之后的任何内容,直接退出循环。
break n 你是数字,可以结束指定层数的循环。
continue命令
continue命令能够结束当前这一次的循环而直接进入下一次的循环,continue之后的内容不在执行,例如:
#!/bin/bash
for i in `seq 1 3`;do
echo $i
if [ $i -eq 2 ];then
continue
fi
echo 第$i次循环
done
执行结果如下:
可以看到在i等于2时,执行到echo $i之后满足if条件,执行continue,直接结束了i等于2这次循环,不在执行echo 第$i次循环 这句,直接进行i等于3这层循环。
continue n n是数字,可以跳过几层当前次的循环。
shift命令
shift命令能够使参数列表左移n次,n是数字,例如:
#!/bin/bash
for ((i=0;i<5;i++));do
echo $*
shift
done
执行结果如下:
可见,每次循环都会执行shift命令,这是输出的所有参数都会少第一个参数。
shift n n是数字可以使参数列表左移n次,即是每次都少开始的前n个参数。
3.函数
函数是一系列代码的集合,当我们定义了一个函数时,我们可以在后面调用这个函数,而且是可以重复调用的,他不是单独的一个进程,不能独立运行,而是shell脚本的一部分,函数的生命周期是调用时开始,返回时结束。
创建函数
创建函数有三种方法如下:
1
function f_name {
...函数体...
}
2
function f_name () {
...函数体...
}
3
f_name (){
...函数体...
}
删除函数
删除函数的方式即是unset加上函数名,例如:
unset function_name
函数参数
传递参数给函数:调用函数时,在函数名后面以空白分隔给定参数列表即可,例如:
function_name 参数1 参数2 ······
这样我们就可以在函数中使用$1,$2,······$n来引用这些参数
函数文件
我们可以创建属于我们自己的函数文件,里面可以是你自己写的或者是需要的函数
函数调用
我们可以调用我们写的或者是系统内置的函数来满足我们的需求。
调用函数文件的方式如下:
.+空格+函数文件名
或者
source+空格+函数文件名
调用脚本中的函数打方式如下
function_name
直接文件名即可,如果有参数,后面可以加上参数。
环境变量,本地变量和局部变量
函数中的定义的环境变量在函数以及当前shell,当前shell的子shell有效,而局部变量只在函数中有效,本地变量只在当前shell和函数中有效,在其他地方无效。
设置局部变量的方法如下:
local can=3
函数递归
函数递归是指函数自己可以直接或间接调用自身,当最深一层有了返回值之后逐步返回返回值。
函数返回值
返回值有两种情况:
1
函数的执行结果返回值:
(1) 使用echo等命令进行输出
(2) 函数体中调用命令的输出结果
2
函数的退出状态码:
(1) 默认取决于函数中执行的最后一条命令的退出状态码
(2) 自定义退出状态码,其格式为:
return 从函数中返回,用最后状态命令决定返回值
return 0 无错误返回。
return 1-255 有错误返回
4.数组
数组是存储多个元素的连续的内存空间,相当于多个变量的集合,我们可以通过下面的方式应用数组中的值:
${ARRAY_NAME[INDEX]}
ARRAY_NAME是数组名字,INDEX是数组下标
创建数组
创建数组的方式有四种
declare -a ARRAY_NAME
declare -A ARRAY_NAME
-A是创建关联数组
给数组赋值
给数组赋值的方法主要有4中,如下:
(1) 一次只赋值一个元素;
ARRAY_NAME[INDEX]=VALUE
weekdays[0]="Sunday"
weekdays[1]="Thursday"
(2) 一次赋值全部元素:
ARRAY_NAME=("a" "b" "c" ...)
(3) 只赋值特定元素:
ARRAY_NAME=([0]="VAL1" [3]="VAL2" ...)
(4) 交互式数组值对赋值
read -a ARRAY
引用数组所有元素
${ARRAY_NAME[*]}
${ARRAY_NAME[@]}
数组的长度(数组中元素的个数):
${#ARRAY_NAME[*]}
${#ARRAY_NAME[@]}
向数组中追加元素
ARRAY[${#ARRAY[*]}]=value
以上是关于shell脚本进阶的主要内容,如果未能解决你的问题,请参考以下文章