当前位置: 首页 > article >正文

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


http://www.kler.cn/a/303663.html

相关文章:

  • Postman接口测试(断言、关联、参数化、输出测试报告)
  • go反射深入学习
  • 【代码审计】常见漏洞专项审计-业务逻辑漏洞审计
  • [Linux网络编程]10-http协议,分别使用epoll和libevent两种方式实现B/S服务器
  • layui.all.js:2 Uncaught Error: Syntax error, unrecognized expression
  • Vulnhub靶场案例渗透[8]- HackableII
  • sql severs 递归查询
  • seafaring靶场漏洞测试攻略
  • MATLAB移动目标检测与追踪系统
  • 数据结构—线性表和顺序表
  • 【系统分析师】计算机组成与体系架构
  • 基于ssm框架的学生社团管理系统APP---附源码75171
  • JavaScript的事件介绍
  • MySQL_SQLYog简介、下载及安装(超详细)
  • 【深度学习】PyTorch 的发展历程 截止 2.1.0
  • 茅台镇酱香型白酒你知道多少?
  • MongoDB日志级别
  • 如何在本地Windows运行hadoop
  • conda 安装tensorflow一些命令
  • 人工智能在鼻咽癌诊断和治疗中的应用进展、当前挑战和未来前景|文献精析·24-09-13
  • 苹果CMS海洋CMS那个更容易被百度收录?苹果CMS站群
  • 输电线路在线监测摄像头:规格(一)
  • 【已解决】请教 “Sa-Token 集成 xxl-job,报错:非 web 上下文无法获取 HttpServletRequest” 如何解决
  • oracle select字段有子查询会每次执行子查询吗
  • 波克城市 x NebulaGraph|高效数据血缘系统在游戏领域的构建实战
  • Java中各种数据结构如何使用stream流