shell之正则+数组

九、shell 编程-数组

普通数组:只能用整数作为数组的索引 关联数组:可以使用字符串作为数组的索引

数组定义
普通数组定义:
[root@newrain shell]# books=( linux shell awk sed )  
引用:
[root@newrain shell]# echo ${books[0]}
linux
[root@newrain shell]# echo ${books[1]}
shell
[root@newrain shell]# echo ${books[2]}
awk
​
关联数组需要提前声明
declare -A myarry1
[root@newrain shell]# declare -A myarry1
[root@newrain shell]# myarry1=([name]=newrain [sex]=man [age]=26) 
[root@newrain shell]# echo ${myarry1[name]}
newrain
[root@newrain shell]# echo ${myarry1[age]}
26
定义方法1:
    # declare -a myarry=(5 6 7 8) 
    # echo ${myarry[2]}
        显示结果为 7
        
定义方法2:
    # array=( one two three four five six )
    # array2=(tom jack alice)
    # array3=(`cat /etc/passwd`)
    # array4=(tom jack alice "bash shell")
    # array5=(1 2 3 4 5 6 7 "linux shell" [20]=saltstack)
    
定义方法3: # 普通数组下标只能是数字
#!/bin/bash 
area[11]=23 
area[13]=37 
area[51]="UFOs"
访问数组

当设置任何数组变量时,可以访问它

[root@newrain shell]# aa=(haha heihei baibai)
[root@newrain shell]# echo ${aa[0]}    //访问数组中的第一个元素
[root@newrain shell]# echo ${aa[@]}         //访问数组中所有的元素,等同与echo ${aa[*]}
[root@newrain shell]# echo ${#aa[@]}   //统计元素的个数
[root@newrain shell]# echo ${!aa[@]}   //统计索引

${array_name[index]} //引用

示例

#!/bin/bash
NAME[0]="BJ"
NAME[1]="SH"
NAME[2]="SZ"
NAME[3]="GZ"
NAME[4]="HZ"
NAME[5]="ZZ"
echo "First Index: ${NAME[0]}"
echo "Second Index: ${NAME[1]}"
echo "sixth Index: ${NAME[5]}"

输出结果为

 $./test.sh
First Index: BJ 
Second Index: SH 
sixth Index: ZZ

您可以访问数组中的所有项目通过以下方式之一:

${array_name[*]}
${array_name[@]}

示例

#!/bin/sh
NAME[0]="BJ"
NAME[1]="SH"
NAME[2]="SZ"
NAME[3]="GZ"
NAME[4]="HZ"
echo "First Index: ${NAME[*]}"
echo "Second Index: ${NAME[@]}"

输出结果

 $./test.sh
First Index: BJ SH SZ GZ HZ 
Second Index: BJ SH SZ GZ HZ

疑难点 shell数组中"*" 和 "@" 区别

关于在shell脚本中数组变量中 “*”跟 “@” 区别
“*”当变量加上“” 会当成一串字符串处理. 
“@”变量加上“” 依然当做数组处理. 
在没有加上“” 的情况下 效果是等效的.

示例

#!/usr/bin/env bash
array=(gz cloud 19)
echo "case 1"
for line in "${array[@]}"
do
        echo $line
done
​
echo "case 2"
for line in "${array[*]}"
do
        echo $line
done
​
echo "case 3"
for line in ${array[*]}
do
        echo 
<think> 嗯,用户想要了解如何使用正则表达式去除数组下标。这个问题在编程中很常见,特别是在处理数组元素时。让我仔细分析一下。 用户的需求很明确:使用正则表达式去除数组下标。不过从实际编程角度看,数组下标是数据结构固有的索引机制,不太可能也不需要直接"去除"。用户可能实际想解决的是如何提取数组元素的值而忽略索引格式,或者处理包含下标的字符串表示形式。 参考站内资料,引用[1]提到了删除数组元素的shell语法,引用[2][3][4]提供了JavaScript正则表达式操作字符串的方法。特别注意到引用[4]详细说明了字符串的replace、match等方法,这可能是解决问题的关键。 用户真正需要的应该是: 1. 当数组被字符串化后出现下标标记时(如调试输出),去除多余的索引信息 2. 处理特定格式的字符串数组表示 让我构思几种实用场景的解决方案: 第一种情况是针对类似"arr[0]=value"这种格式。可以用正则匹配方括号和数字,替换为空字符串。核心模式是:$\text{\\s*\\[\\d+\\]}$ 第二种情况是处理数组toString后的逗号分隔值。这不需要正则,直接split即可,如引用[2]所示 第三种高级应用是用正则分组提取值,忽略下标位置信息,如引用[5]展示的QT例子 需要提醒用户注意语言差异,JavaScript和Shell的处理方式完全不同。在JavaScript中主要操作字符串表示,而Shell数组操作需要完全不同的方法。 考虑到用户可能混淆概念,在回答中需要明确区分: - 真实数组操作(无需正则) - 数组字符串表示的处理(使用正则) 最后给出具体代码示例时,要包含常见语言的实现,特别是JavaScript的正则解法,因为引用资料中JavaScript案例最丰富。同时要补充说明Shell环境下完全不同的处理逻辑。 </think> 根据您的需求,以下是使用正则表达式处理数组下标的方法总结(重点参考引用[2][3][4]): ### 一、核心解决方案:正则表达式匹配下标模式 1. **匹配所有下标格式** 使用模式:`\[\d+\]` - `\[` → 匹配左方括号 `[` - `\d+` → 匹配1个或多个数字(下标) - `\]` → 匹配右方括号 `]` 2. **在字符串操作中移除下标** ```javascript // JavaScript示例(引用[2][4]) const arrString = "item[0], value[1], data[2]"; const cleaned = arrString.replace(/\[\d+\]/g, ""); console.log(cleaned); // 输出: item, value, data ``` ### 二、不同场景下的应用 #### 1. 处理带下标的数组字符串(如日志解析) ```javascript // 输入: "Apple[0], Banana[1], Cherry[2]" const input = "Apple[0], Banana[1], Cherry[2]"; const result = input.replace(/\s*\[\d+\]\s*/g, ""); // 输出: "Apple,Banana,Cherry" (可直接用split(',')转数组) ``` #### 2. 提取纯值忽略下标(引用[4]的match用法) ```javascript const str = "itemA[5] = 10, itemB[6] = 20"; const values = str.match(/[a-zA-Z]+(?=\[)/g); console.log(values); // 输出: ["itemA", "itemB"] ``` #### 3. 保留值但标准化格式 ```python # Python示例(类似引用[4]逻辑) import re data = "results[3]=SUCCESS, results[4]=FAIL" cleaned = re.sub(r'\[(\d+)\]', r'_\1', data) print(cleaned) # 输出: results_3=SUCCESS, results_4=FAIL ``` ### 三、关键注意事项 1. **语言差异处理** - **JavaScript**:用`/g`全局匹配(引用[4]) - **Shell**:需用`sed`命令(引用[1]未直接支持正则删下标) ```bash arr_str='item[0] value[1]' echo $arr_str | sed 's/\[[0-9]*\]//g' ``` 2. **特殊下标场景** 若含非数字下标(如`map['key']`),需扩展正则式: ```regex /\[\w+\]/g # 支持字母数字组合 ``` ### 四、操作本质说明 **正则表达式在此场景的作用是字符串模式匹配,而非直接操作内存中的数组**(引用[1]中数组删除需用`unset`)。实际流程: ``` 原始字符串 → 正则匹配下标 → 替换/移除 → 获得无下标字符串 ``` --- **
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值