一、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=
var1−lt15]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=
3等参数表示运行脚本时输入的数据,123表示第一第二第三数据例如total=[ $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
"
c
o
u
n
t
=
param" 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://img−blog.csdnimg.cn/20181115093648475.png)若将*改为$@,输出结果 将变得大不一样
echo
count=1
for param in “$@”
do
echo "$@ Parameter #$count =
p
a
r
a
m
"
c
o
u
n
t
=
param" 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变量时,并不会影响在脚本主体中赋给
temp变量时,并不会影响在脚本主体中赋给temp变量的值。
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