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 状态码,如果连接超时则返回相应的错误。

相关推荐
Martin -Tang25 分钟前
vite和webpack的区别
前端·webpack·node.js·vite
迷途小码农零零发26 分钟前
解锁微前端的优秀库
前端
王解1 小时前
webpack loader全解析,从入门到精通(10)
前端·webpack·node.js
我不当帕鲁谁当帕鲁1 小时前
arcgis for js实现FeatureLayer图层弹窗展示所有field字段
前端·javascript·arcgis
那一抹阳光多灿烂1 小时前
工程化实战内功修炼测试题
前端·javascript
放逐者-保持本心,方可放逐2 小时前
微信小程序=》基础=》常见问题=》性能总结
前端·微信小程序·小程序·前端框架
毋若成4 小时前
前端三大组件之CSS,三大选择器,游戏网页仿写
前端·css
舞动CPU4 小时前
linux c/c++最高效的计时方法
linux·运维·服务器
红中马喽4 小时前
JS学习日记(webAPI—DOM)
开发语言·前端·javascript·笔记·vscode·学习
Black蜡笔小新5 小时前
网页直播/点播播放器EasyPlayer.js播放器OffscreenCanvas这个特性是否需要特殊的环境和硬件支持
前端·javascript·html