Shell脚本使用进阶

一、Bash break、continue用法
1.break
#break是退出循环的一个简单方法,用break命令来退出任意类型的循环,包括while和until循环
无论是for循环或者while循环,break仅停止其最内部的循环,外部循环照常进行
若停止两层,则利用用法break n(代表数字)例如:break 2
可用以下代码验证
more s3.sh
#!/bin/bash

for (( a = 1; a < 4; a++ ))
do
echo “Outer loop: $a”
for (( b = 1; b < 100; b++ )) #内部循环里的for语句指明当变量b等于100时停止迭代
do
if [ $b -eq 5 ] #但内部循环的if-then语句指明当变量b的值等于5时执行break命令
then
break #在处理多个循环时,break命令会自动终止你所在的最内层的循环
fi
echo " Inner loop: $b"
done
done
运行结果
在这里插入图片描述
2.continue
#continue命令可以提前中止某次循环中的命令,但并不会完全终止整个循环
在循环语句中,continue仅终止本次循环 的进行,其下的循环内的剩余命令将不再被执行
参照如下代码进行联系:
#!/bin/bash
var1=0
while echo “while iteration: $var1”
[ v a r 1 − l t 15 ] d o v a r 1 = var1 -lt 15 ] do var1= var1lt15]dovar1=[ $var1 + 1 ]
if [ $var1 -gt 5 ] && [ $var1 -lt 10 ]
then
continue
fi
echo " Inside iteration number: $var1"
done
在这里插入图片描述
二、Bash Case
case语句,是代替if-then的以中简便方法
具体格式用例子代替:
#!/bin/bash

case $USER in
rich | barbara) #标注范围,意为当用户为rich或者Barbara时
echo “Welcome, $USER”
echo “Please enjoy your visit”;;#标准输出,在本次匹配结束后,将输出一下语句,注意,结尾“;;”必须加上
testing)
echo “Special testing account”;;
jessica)
echo “Do not forget to log off when you’re done”;;
*)
echo “Sorry, you are not allowed here”;;
esac
在这里插入图片描述
二、Bash用户输入、命令行参数、特殊参数、测试参数
命令行参数
$1,$2, 3 等 参 数 表 示 运 行 脚 本 时 输 入 的 数 据 , 123 表 示 第 一 第 二 第 三 数 据 例 如 t o t a l = 3等参数表示运行脚本时输入的数据,1 2 3表示第一 第二 第三数据 例如 total= 3123total=[ $1 * $2 ]
echo The first parameter is $1.
echo The second parameter is $2.
echo The total value is $total.
执行结果:
在这里插入图片描述
读取脚本名,用$0参数获取shell在命令行启动的脚本名
参数统计 $#
#!/bin/bash
echo The zero parameter is set to: $0
echo There were $# parameters supplied.
结果:
在这里插入图片描述
. Bash用户输入、命令行参数、特殊参数、测试参数
命令行参数
./s1.sh 10 20 #向s1脚本传递了两个参数10和20 脚本会通过特殊的变量来处理参数
读取参数
简单代码举例:
从外界获取参数$1 $2
在这里插入图片描述

#抓取所有的数据
#有时候需要抓取命令行上提供的所有参数。这时候不需要先用KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲变量来判断命令行上有多少参数,…*变量会将所有参数当成单个参数
#$@变量会单独处理每个参数
下面利用代码将其进行比较:
echo
count=1

for param in "$" #用for命令遍历这两个特殊变量,你能看到它们是如何不同地处理命令行参数的
do
echo "$
Parameter #$count = p a r a m &quot; c o u n t = param&quot; count= param"count=[ c o u n t + 1 ] d o n e 输 出 结 果 为 : ! [ 在 这 里 插 入 图 片 描 述 ] ( h t t p s : / / i m g − b l o g . c s d n i m g . c n / 20181115093648475. p n g ) 若 将 count + 1 ] done 输出结果为: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181115093648475.png) 若将 count+1]done![](https://imgblog.csdnimg.cn/20181115093648475.png)*改为$@,输出结果 将变得大不一样
echo
count=1

for param in “$@”
do
echo "$@ Parameter #$count = p a r a m &quot; c o u n t = param&quot; count= param"count=[ $count + 1 ]
done
输出结果为:
在这里插入图片描述
用户输入
#bash shell为此提供了read命令
#read命令从标准输入(键盘)或另一个文件描述符中接受输入。在收到输入后,read命令会将数据放进一个变量
利用简单代码举例:
read -n1 -p "Do you want to continue [Y/N]? " answer
case $answer in
Y | y) echo
echo “fine, continue on…”;;
N | n) echo
echo OK, goodbye
exit;;
esac
输出结果如下:
在这里插入图片描述
Bash函数及函数递归与返回、传参
基本的脚本函数
函数是一个脚本代码块,你可以为其命名并在代码中任何位置重用。要在脚本中使用该代码块时,只要使用
所起的函数名就行了(这个过程称为调用函数)
代码举例:
function func1 {
echo “This is an example of a function”
}#函数必须在引用之前进行定义,否则将会报错

count=1
while [ KaTeX parse error: Expected 'EOF', got '#' at position 24: …e 5 ] do func1 #̲每次引用函数名func1时,b…[ $count + 1 ]
done
echo “This is the end of the loop”
func1
echo “Now this is the end of the script”
输出结果如下:
在这里插入图片描述
#函数在使用$1和$2变量,它们和脚本主体中的$1和$2变量并不相同。要在函数中使用这些值,必须在调
用函数时手动将它们传过去
代码举例:
function func7 {
echo $[ $1 * $2 ]
}
if [ KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲ -eq 2 ] then v…(func7 $1 $2) #将$1 $2传入函数中,否则将会报错
echo “The result is $value”
else
echo “Usage: badtest1 a b”
fi
#通过将$1和$2变量传给函数,它们就能跟其他变量一样供函数使用了
执行结果如下:
在这里插入图片描述

函数的全局变量和局部变量
全局变量
function func1 {
temp=$[ v a l u e + 5 ] r e s u l t = value + 5 ] result= value+5]result=[ $temp * 2 ]
}
temp=4
value=6
func1
echo "The result is KaTeX parse error: Expected 'EOF', got '#' at position 11: result" #̲result为全局变量,在函数内外都可以使用
运行结果:
在这里插入图片描述
局部变量:
#函数内部使用的任何变量都可以被声明成局部变量。要实现这一点,只要在变量声明的前面加上local关键字就可
以了
代码如下:
function func1 { #func1函数中使用 t e m p 变 量 时 , 并 不 会 影 响 在 脚 本 主 体 中 赋 给 temp变量时,并不会影响在脚本主体中赋给 temptemp变量的值。
local temp=$[ KaTeX parse error: Expected 'EOF', got '#' at position 16: value + 5 ] #̲此时 在本函数内temp值已…[ $temp * 2 ]
}
temp=4
value=6
func1
echo “The result is $result”
if [ $temp -gt $value ]
then
echo “temp is larger”
else
echo “temp is smaller”#所以4,6比较,temp 是小的
fi
运行结果:
在这里插入图片描述
Bash脚本数组定义声明及引用
数据结构,数据序列,保存了连续的多个数据,可以使用索引获取相关元素,相当于多个变量的集合
Bash支持一维数组(不支持多维数组),并且没有限定数组的大小 ;数组元素的下标由0开始编号。获取数
组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0
普通数组
array_t2[1]=1
array_t2[2]=2
array_t2[3]=3
array_t2[4]=4
echo ${array_t2[]} #打印所有值=echo ${array_t2[@]} 也可用@符号
echo ${!array_t2[
]} #! 打印索引号,下标=echo ${!array_t2[@]} #也可用@符号
echo ${#array_t2[]} #显示数组中的元素个数(只统计值不为空的元素)=echo ${#array_t2[@]}
运行结果:
在这里插入图片描述
关联数组
关联数组支持字符串作为数组索引。使用关联数组必须先使用declare -A声明它
_t3 # 声明之后就可以给其赋值了
代码格式举例:
declare -A array_t3 # 声明之后就可以给其赋值了
array_t3=([name1]=westfile [name2]=linkpark)
echo ${array_t3[name1]} #name1 name2是关联数组的index
echo ${array_t3[name2]}
array_t3[name3]=u2 #也可分开赋值
array_t3[name4]=coldplay
echo ${array_t3[
]}
运行结果:
在这里插入图片描述

数组中数据的截取与替换:
array_t4=(1 2 3 4 5 6)
echo KaTeX parse error: Expected 'EOF', got '#' at position 19: …ray_t4[*]:2:2} #̲从数组全部元素中第2个元素向后…{array_t1[]:2:2} “#截取并赋值
echo "array_t42=${array_t1[
]/5/6} "#数组中的5替换为6
运行结果:
在这里插入图片描述
array_t5=(one two three four five)
echo ${array_t5[]#o} #从左 非贪婪匹配并删除所有数组变量中匹配内容
echo ${array_t5[
]##o} #从左贪婪匹配并删除所有数组变量中匹配的内容
echo ${array_t5[
]%o} #从右 非贪婪匹配并删除所有数组变量中匹配内容
echo ${array_t5[
]%%o} #从右贪婪匹配并删除所有数组变量中匹配内容
运行结果:
在这里插入图片描述

for循环内遍历数组
格式如图:
在这里插入图片描述
结果:
在这里插入图片描述
遍历目录/boot中的的内容
#!/bin/bash
array_t6=($(ls /boot))
for i in ${array_t6[*]};do #以数组值的方式直接遍历数组
echo $i
done
结果为
在这里插入图片描述
Bash脚本信号捕捉
Linux利用信号与系统中的进程进行通信, kill -9
生成信号,bash shell允许用键盘上的组合键生成两种基本的Linux信号。 这个特性在需要停止或暂停程序时
很方便
中断进程
sleep 100
ctrl + c
暂停进程,可在进程运行期间暂停进程
sleep 100
ctrl + z
捕获信号:
信号出现时捕获它们并执行其他命令 。trap命令允许来指定shell 脚本要监看并从shell中拦截信号
使用trap来忽略信号,并控制脚本的行为
代码举例:
1.捕获脚本提示:
#trap命令会在每次检测到SIGINT信号时显示一行简单的文本消息。捕获这些信号会阻止用户用bash shell组合
键Ctrl+C来停止程序;每次使用Ctrl+C组合键,脚本都会执行trap命令中指定的echo语句,而不是处理该信号并
允许shell停止该脚本
trap "echo ’ Sorry! I have trapped Ctrl-C’ " SIGINT

echo This is a test script

count=1
while [ KaTeX parse error: Expected 'EOF', got '#' at position 30: … do echo "Loop #̲count"
sleep 1
count=$[ $count + 1 ]
done

echo “This is the end of the test script”
执行结果:

在这里插入图片描述
捕获脚本结束进程:
trap “echo Goodbye…” EXIT

count=1
while [ KaTeX parse error: Expected 'EOF', got '#' at position 29: … do echo "Loop #̲count"
sleep 1
count=$[ $count + 1 ]
done
执行结果:
在这里插入图片描述
移除脚本:
trap “echo ’ Sorry… Ctrl-C is trapped.’” SIGINT

count=1
while [ KaTeX parse error: Expected 'EOF', got '#' at position 29: … do echo "Loop #̲count"
sleep 1
count=$[ $count + 1 ]
done

#Remove the trap
trap – SIGINT
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值