善用chatGPT学习 | bash脚本如何判断字符串在数组中

简介: 善用chatGPT学习 | bash脚本如何判断字符串在数组中

image.png


确定需求、编写demo


这是一个很有意思的事情,今天下午,有人找到运维小弟我,帮忙分析脚本报错: 分析下来后,发现核心需求点是:定义一个数组,然后获取一个字符串,判断该字符串是否出现在数组中。


其大概可以图示为如下:

image.png

作为运维的我,心想,这多简单啊,撸起袖子就写了起来,不一会,该demo已经写出来了,如下:

#!/bin/bash
# pdudo
# 2023年3月30日
# 定义数组 array
array=(pdudo1 pdudo2 pdudo4 pdudo5)
# 定义字符串
searchString="pdudo1"
# 定义循环 遍历数组 和 字符串相匹配
for value in ${array[@]};
do
        # 判断是否相等
        if [ $value = $searchString ];then
                # 输出相等信息
                echo "$searchString 出现在数组中"
        fi
done



上述代码,先定义了数组array,其值为 pdudo1 pdudo2 pdudo4 pdudo5 , 而后定义了 字符串值为 pdudo1, 判断是否出现在数组中的语法,则是 循环获取 数组的值,和 字符串进行匹配,若匹配成功,则输出信息。


代码截图:

image.png


执行后,发现正如我们期待所言。

image.png

于是乎,就将该代码,整合进项目,给开发发过去了,当然作为老手而言,整个过程不超过15分钟,肯定获得了掌声和欢呼声。

image.png

完事之后,想着chatgpt会如何去编写该需求呢,于是抱着好奇心,上去问了一下。



使用chatgpt帮我们写代码


使用bash内置方法=~


要询问chatgpt,我们需要先明确需求,例如,我将上述需求给整理了一下,定义如下:

用bash脚本定义一个数组,其值为 append append2 append3 , 写一个程序,接收一个值,用以判断是否在数组中。


很快,chatgpt就回复我们了,其信息如下:

image.png


嘿,定睛一看,和我上述写的demo是一样的,不由得,我飘了。

于是再度发问,是否还有更加简单的方法呢?

image.png



额,这就有点尴尬了,原来bash有这个方法(=~)来判断字符串是否出现在数组中,自己还苦哈哈的写循环的方法,于是乎,修改了一下,用于验证是否准确,其脚本如下:

#!/bin/bash
# pdudo
# 2023年3月30日
# 定义数组 array
array=(pdudo1 pdudo2 pdudo4 pdudo5)
# 定义字符串
searchString="pdudo1"
# 判断是否相等
if [[ ${array[@]} =~ $searchString ]];then
        # 输出相等信息
        echo "$searchString 出现在数组中"
fi

执行后,发现确实能够达成需求。

代码截图

image.png


运行效果

image.png

于是乎,去查询了一下该方法,终于搞清楚了这个东东,=~bash的特性,必须双引号[[ ]]括起来,语法结构为 数组值 =~ 匹配字符串,返回值为0则是匹配成功,返回值为1则是匹配失败。

我们可以编写脚本测试一下:


image.png


上述代码中的$?表示上一个命令的返回值,即命令: [[ ${array[@]} =~ $searchString ]]

执行后效果如下

image.png

可见分析的没问题,又学到了,赞赞赞。


使用关联数组

学习完上诉使用bash内置方法=~后,接着,问下是否还有其他方法可以解决该问题。

image.png


这个就很熟悉了,所谓的关联数组,大可将其理解为 hash字典 即可,而代码中的declare是在定义属性,对,没看错哦,bash也是可以定义属性的,比如变量只读,定义为函数 ,定义为 拥有下标的数组 , 定义为 关联数组 等等,可以通过man bash获取更多的信息。

image.png


这里就不再阐述了,根据chatgpt提供的案例,我们修改一下脚本,可以将其更改为:

#!/bin/bash
# pdudo
# 2023年3月30日
# 定义数组 array
array=(pdudo1 pdudo2 pdudo4 pdudo5)
# 定义关联数组
declare -A dictArray
for v in ${array[@]}
do
        dictArray[$v]=1
done
# 定义字符串
searchString="pdudo1"
# 判断是否出现在数组中
if [ ${dictArray[$searchString]} ];then
        echo "$searchString 出现在数组中"
else
        echo "$searchString 不出现在数组中"
fi

由于我们定义的是下标形的数组,所以需要先将其转换为关联数组,而后直接判断该关联数组,即可判断是否出现在数组中了,这个就不掩饰了。



自定义数组

再得到2种方法之后,在此询问,是否还有其他方法,当然chatgpt果然没让我失望,返回了这样的结果:

image.png


chatgpt上面提供的代码,其实在机器上不能运行,需要将其函数定义调整到调用之前才行。

初看,细看,再仔细看,这。。。。tm是什么代码,直接给我干破防了。

我们来分析下,这函数定义的到底是个啥,我们拷贝函数出来:

# 定义in_array函数
function in_array() {
  local e match="$1"
  shift
  for e; do [[ "$e" == "$match" ]] && return 0; done
  return 1
}


其中,local是定义局部变量,若不指定,则定义的是全局变量,而sfift则是将参数列表向左移动一个位置,额。。。e是啥意思? 先不急,我们可以改改脚本,修改如下:

# 定义数组 in_array
function in_array() {
        # 获取传入的第一个参数
        local key=$1
        # 参数向左偏移一位
        shift
        # 获取所有参数
        local array=$*
        # 循环数组
        for v in $array
        do
                # 判断是否相等
                if [ $v = $key ];then
                        return 0
                fi
        done
        return 1
}


结合上面的讲解,这样是否看起来,是否很熟悉了呢?

我们验证下代码是否可行,代码如下:

image.png


执行后,结果如下:

image.png


再反过头来看这个函数:

# 定义in_array函数
function in_array() {
  local e
}


bash中,此时e已经获取到了全部的参数,当然不能通过echo来输出变量e的值,需要借助for循环,我们可以看这个例子:

#!/bin/bash
# pdudo
# 2023年3月30日
# 定义函数
function in_array() {
  local a
  for a
  do
          echo $a
  done
}
# 执行函数
in_array 1 2 3 5 6

运行一下,直接结果为:

image.png


运行结果符合我们预期



总结


很久没写文章了,也不给自己找借口,就是因为懒,今天这篇文章是有感而发,chatgpt真的非常强大了,要好好的利用起来才行,暴力破解不是唯一的解法,再简单的需求,也许也会有更的优解法,想让代码变得更骚么? 借助chatgpt让你更上一层楼吧。


也许有一天,干掉我们的不是chatgpt,而是更善用chatgpt的人,就这样吧。




相关文章
|
2月前
|
自然语言处理 机器人 Python
ChatGPT使用学习:ChatPaper安装到测试详细教程(一文包会)
ChatPaper是一个基于文本生成技术的智能研究论文工具,能够根据用户输入进行智能回复和互动。它支持快速下载、阅读论文,并通过分析论文的关键信息帮助用户判断是否需要深入了解。用户可以通过命令行或网页界面操作,进行论文搜索、下载、总结等。
58 1
ChatGPT使用学习:ChatPaper安装到测试详细教程(一文包会)
|
2月前
|
自然语言处理 数据安全/隐私保护 iOS开发
ChatGPT使用学习(三):ChatGPT桌面版使用
本文介绍了ChatGPT桌面版,一个由OpenAI推出的独立桌面应用程序,支持离线使用、数据隐私保护和快速响应。用户界面友好,支持多语言交互。桌面版无需网络连接,保护用户数据隐私,并提供快速响应。用户可通过Github链接下载安装,使用谷歌账号登录。此外,OpenAI官方也发布了适用于macOS的桌面端应用,并向所有用户免费开放。
49 1
|
2月前
|
数据挖掘 数据库
ChatGPT在数据分析学习阶段的应用
ChatGPT在数据分析学习阶段的应用
47 6
|
2月前
|
机器学习/深度学习 自然语言处理
要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 21 章:课程学习提示
要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 21 章:课程学习提示
33 1
|
2月前
|
Devops 关系型数据库 大数据
1000个开源免费的bash脚本合集
【10月更文挑战第4天】
|
4月前
|
存储 前端开发 Java
跟着ChatGPT4o学全栈,我看到未来“学习”的模样
本文作者用一个GPT4o学习全栈的例子来阐述大模型对学习的影响,以及对于未来学习的思考。
|
4月前
|
Shell 数据处理
Bash 中检查文件是否包含字符串
【8月更文挑战第27天】
48 5
|
4月前
|
Shell
一个能够生成 Markdown 表格的 Bash 脚本
【8月更文挑战第20天】这是一个使用Bash脚本生成Markdown表格的示例。脚本首先设置表头与内容数据,然后输出Markdown格式的表格。用户可以根据需要自定义表格内容。使用时,只需将脚本保存为文件(如 `generate_table.sh`),赋予执行权限,并运行它,即可在终端看到生成的Markdown表格。
|
4月前
|
Unix Shell Linux
在Linux中,什么是Bash脚本,并且如何使用它。
在Linux中,什么是Bash脚本,并且如何使用它。
|
4月前
|
Shell 开发者
深入理解Bash脚本中的函数
【8月更文挑战第20天】
72 0