Shell脚本函数与数组(Linux篇)
1.函数
1.1.函数定义
linux shell
可以用户定义函数,然后在shell脚本中可以随便调用。Shell
函数定义的语法格式如下:
[function] funname [()]{
函数体
[return int;]
}
function
关键字可写,也可不写。
-
格式1:简化写法,不写 function 关键字、
函数名(){ 函数体 }
-
格式2:标准写法,推荐使用
function 函数名(){ 命令序列 }
所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
示例一:
#!/bin/bash
#author: zking
#函数定义
#格式1:
#function demoFun(){
#格式2:
demoFun(){
echo "这是一个函数。"
}
echo "--函数开始执行--"
#函数调用
demoFun
echo "--函数执行完毕--"
通过函数名直接调用,不加小括号。
1.2.函数返回值
return
在函数中定义状态返回值,返回并终止函数,但返回的只能是 0-255 的数字,类似于 exit
。
#!/bin/bash
#author: zking
funDemo(){
echo "这个函数会对输入的两个数字进行相加运算:"
echo "请输入第一个数字:"
read num1
echo "请输入第二个数字:"
read num2
echo "两个数字分别是 $num1 和 $num2"
return $(($num1+$num2))
}
funDemo
echo "输入的两个数字的和为 $?"
函数返回值在调用该函数后通过 $? 来获得。
return 语句只能返回一个介于 0 到 255 之间的整数,而两个输入数字的和可能超过这个范围,则提示错误信息:return: 返回值: numeric argument required
。
1.3.函数传参
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...,以此类推。
#!/bin/bash
#author: zking
funDemo(){
echo "第一个参数:$1"i
echo "第二个参数:$2"
echo "第三个参数:$3"
echo "第四个参数:${4}"
echo "总共有 $# 个参数!"
echo "作为一个字符串输出所有参数:$*"
}
funDemo 1 2 3 45 6
注意:$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
另外,还有几个特殊字符用来处理参数:
参数处理 | 说明 |
---|---|
$# | 传递到脚本或函数的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
2.数组
2.1.数组定义
数组中可以存放多个值。Bash Shell
只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP
类似)。
与大部分编程语言类似,数组元素的下标由 0 开始。
Shell
数组用括号来表示,元素用"空格"符号分割开,语法格式如下:
array_name=(value1 value2 ... valuen)
创建一个简单的数组 my_array:
#!/bin/bash
# author: zking
my_array=(A B "C" D)
我们也可以使用数字下标来定义数组:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
2.2.读取数组
读取数组元素值的一般格式是:${array_name[index]}
。
#!/bin/bash
#author: zking
#格式1:
#my_array=(A B "C" D)
#格式2:
my_array[0]=A
my_array[1]=B
my_array[2]="C"
my_array[3]=D
echo "第一个元素:${my_array[0]}"
echo "第二个元素:${my_array[1]}"
echo "第三个元素:${my_array[2]}"
echo "第四个元素:${my_array[3]}"
2.3.关联数组
Bash
支持关联数组,可以使用任意的字符串、或者整数作为下标来访问数组元素。
关联数组使用 declare 命令来声明,语法格式如下:
declare -A array_name
-A 选项就是用于声明一个关联数组,关联数组的键是唯一的。
访问关联数组元素可以使用指定的键,格式如下:array_name["index"]
示例一:
#!/bin/bash
#author: zking
#创建一个关联数组 map,并创建不同的键值:
#declare -A map=(["zking"]="www.zking.com" ["taobao"]="www.taobao.com" ["qq"]="www.qq.com")
#先声明一个关联数组,然后再设置键和值:
declare -A map
map["zking"]="www.zking.com"
map["taobao"]="www.taobao.com"
map["qq"]="www.qq.com"
echo "${map['qq']}"
2.4.所有元素和长度
使用 @ 或 * 可以获取数组中的所有元素,例如:
#!/bin/bash
# author: zking
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"
在数组前加一个感叹号 ! 可以获取数组的所有键:
declare -A map
map["zking"]="www.zking.com"
map["taobao"]="www.taobao.com"
map["qq"]="www.qq.com"
echo "数组中的元素:${map[*]}"
echo "数组中的元素:${map[@]}"
echo "数组中的键:${!map[*]}"
echo "数组中的键:${!map[@]}"
获取数组长度的方法与获取字符串长度的方法相同,例如:
#!/bin/bash
# author: zking
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "数组元素个数为: ${#my_array[*]}"
echo "数组元素个数为: ${#my_array[@]}"
3.综合案例
编写shell脚本实现《检查网站可用性》。
#!/bin/bash
#author: zking
checkUrl(){
HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $1)
if [ $HTTP_CODE -eq 200 ]; then
return 1
else
return 0
fi
}
urls=("www.baidu.com" "www.zking.com")
for url in ${urls[@]}; do
for ((i=0;i<3;i++)); do
checkUrl $url
if [ $? -ne 1 ]; then
FAIL_COUNT[$i]="fail"$i
else
break
fi
done
if [ ${#FAIL_COUNT[*]} -eq 3 ]; then
echo "Warning: $url 连接失败!"
#清空数组
unset FAIL_COUNT[*]
fi
done
curl
是一个功能强大的网络传输工具,可以在命令行中使用。它支持发送和接收数据,并提供了多种协议和功能,如 HTTP
、HTTPS
、FTP
、文件上传、代理等。curl
是一个灵活且广泛应用的工具,常用于测试 API
、下载文件、发送请求等场景。
curl
命令的基本语法如下:
curl [选项] [URL]
其中,URL
是要发送请求或下载的地址。
命令解读:
curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $URL
这段命令是使用 curl 工具来发送一个 HTTP 请求,并且输出 HTTP 响应的状态码。下面是对命令及其参数的详细解释:
-
curl
: 是一个用于发送网络请求的命令行工具。 -
-o /dev/null
: 这个参数的意思是将请求的输出结果(即网页内容)重定向到/dev/null
,也就是丢弃输出,不在终端显示。这样做的目的是只关心响应状态,而不需要实际的内容。 -
--connect-timeout 3
: 这个参数设置连接超时时间为 3 秒。如果在 3 秒内无法建立连接,curl 将会停止尝试并返回错误。 -
-s
: 这个参数表示“silent
”(静默)模式,意味着在执行请求时不显示进度条或错误信息,只输出最终结果。 -
-w "%{http_code}"
: 这个参数用于自定义输出格式,%{http_code}
会输出HTTP
响应的状态码。例如,200 表示请求成功,404 表示未找到页面,500 则表示服务器错误等。
综上所述,这条命令的目的是快速检查URL
的可访问性,并获取其 HTTP
状态码,如果连接超时则返回相应的错误。