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 是一个功能强大的网络传输工具,可以在命令行中使用。它支持发送和接收数据,并提供了多种协议和功能,如 HTTPHTTPSFTP、文件上传、代理等。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 状态码,如果连接超时则返回相应的错误。

相关推荐
崔庆才丨静觅4 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60615 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了5 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅5 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
wdfk_prog5 小时前
[Linux]学习笔记系列 -- [drivers][input]input
linux·笔记·学习
崔庆才丨静觅5 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
盟接之桥6 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
崔庆才丨静觅6 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment6 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅6 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端