linux shell 字典,shell数组与字典总结
[TOC]
> shell里面也有数组和所谓的字典,数组分为索引数组和关联数组(关联数组也就是在其他语言里面的字典,在数组和字典的操作方式基本一致)。
# 一. 数组
## 1.1 创建数组
- 创建空数组
`names=()`
- 数组添加元素
```
names=()
declare -p names
declare -a names=()
names+="beijing"
declare -p names
declare -a names=([0]="beijing")
names+=("beijing" "shanghai" "guangzhou")
declare -p names
declare -a names=([0]="beijing" [1]="beijing" [2]="shanghai" [3]="guangzhou")
```
- 空格分开的字符串用括号包围
`names=("Bob" "Peter" "$USER" "Big Bad John")`
- 指定索引号,索引号不连续的也叫稀疏数组
`names=([0]="Bob" [1]="Peter" [20]="$USER" [21]="Big Bad John")`
- 指定索引号,且单独定义
`names[0]="Bob"`
- 指定路径加通配符
`photos=(~/"My Photos"/*.jpg)`
`files=(*)`
- 显示定义并初始化
`declare -a myfiles='([0]="/home/a/.bashrc" [1]="billing codes.xlsx" [2]="hello.c")'`
- for循环初始化
- 多个数组合并为一个数组
```
names=(beijing shanghai)
ages=(19 20 99)
etcs=(${names[@]} ${ages[@]})
declare -p etcs
declare -a etcs=([0]="beijing" [1]="shanghai" [2]="19" [3]="20" [4]="99")
```
- 数组元素模式匹配(搜索替换元素值)
```
# 精确匹配
names=(beijing shanghai)
new_names=(${names[@]/hai/guangzhou})
declare -p new_names
declare -a new_names=([0]="beijing" [1]="shangguangzhou")
# 模糊匹配
names=(beijing shanghai)
new_names=(${names[@]/*hai/guangzhou})
declare -p new_names
declare -a new_names=([0]="beijing" [1]="guangzhou")
```
## 1.2 访问数组
- 访问数组通常直接用数组下标访问
```
char=(a b c q w x y z)
echo "${char[2]}"
c
```
- 数组的分片访问指定位置
```
# 表示从下标为3的位置开始访问2个元素
arr=(able good fly python java test go now)
echo "${arr[@]:3:2}"
python java
```
- 获取指定下标的元素值的字符个数
```
arr=(able good fly python java test go now)
echo "${#arr[3]}"
6
```
## 1.3 遍历数组
- 打印出变量的类型、值
`declare -p myfiles`
- 使用`printf`循环打印:`${myfiles[@]}`可以理解为`$@`所有的位置参数
`printf '%s\n' "${myfiles[@]}"`
- 显示for循环打印:
```
for file in "${myfiles[@]}"
do
cp "$file" /backups/
done
```
- 使用`"${myfiles[@]}"`代替for循环
```
myfiles=(db.sql home.tbz2 etc.tbz2)
cp "${myfiles[@]}" /backups/
```
- 一次性输出可读性高的字符串连接
```
names=("Bob" "Peter" "$USER" "Big Bad John")
echo "Today's contestants are: ${names[*]}"
Today's contestants are: Bob Peter lhunath Big Bad John
```
- 获取元素个数
```
$ array=(a b c)
$ echo ${#array[@]}
3
declare -a myfiles='([0]=".bashrc" [1]="billing codes.xlsx" [4]="hello.c")'
echo ${#myfiles[@]}
3
```
- 遍历数组的`index`
```
$ first=(Jessica Sue Peter)
$ last=(Jones Storm Parker)
for i in "${!first[@]}"; do
echo "${first[i]} ${last[i]}"
done
结果
Jessica Jones
Sue Storm
Peter Parker
```
- 类似c语言的遍历数组下标,但是步长为2
```
char=(a b c q w x y z)
for ((i=0; i
echo "${char[i]} and ${char[i+1]}"
done
结果
a and b
c and q
w and x
y and z
```
## 1.4 删除元素
```
char=(a b c q w x y z)
declare -p char
declare -a char=([0]="a" [1]="b" [2]="c" [3]="q" [4]="w" [5]="x" [6]="y" [7]="z")
unset char[2]
declare -p char
declare -a char=([0]="a" [1]="b" [3]="q" [4]="w" [5]="x" [6]="y" [7]="z")
```
# 二. 字典
bash里面的字典叫做关联数组,字典其实和数组类似,不同点在于,字典的key是字符串,并且遍历时是随机的。
**注意事项:**
- 字典的key遍历是随机的顺序, 它不适合存放顺序的元素
- 除了遍历是随机的外, 字典的用法基本和数组是一致的
## 2.1 创建字典
- 显示声明并初始化方法1
```
declare -A fullNames
fullNames=( ["lhunath"]="Maarten Billemont" ["greycat"]="Greg Wooledge" )
echo "I'am ${fullNames[greycat]}."
```
- 显示声明并初始化方法2
```
$ declare -A dict
$ dict[astro]="Foo Bar"
$ declare -p dict
declare -A dict='([astro]="Foo Bar")'
```
## 2.2 遍历字典
- 像遍历数组一样,只不过index是字符串了
```
for user in "${!fullNames[@]}"; do
echo "User: $user, full name: ${fullNames[$user]}."
done
User: lhunath, full name: Maarten Billemont.
User: greycat, full name: Greg Wooledge.
```
# 三. 总结
- `for value in "${myfiles[@]}"` 表示遍历数组的元素值
- `for index in "${!myfiles[@]}"` 表示遍历数组的下标号
- `echo "${#myfiles[@]}"` 表示获取数组的元素个数
- `echo "${names[*]}"` 表示一次性的打印成字符串便于阅读
- `declare -a variable` 表示定义一个数组
- `declare -A variable` 表示定义一个字典
- `declare -p variable` 表示打印遍历variable的类型、值
linux shell 字典,shell数组与字典总结相关推荐
- 数组字典_VBA数组与字典解决方案第1讲:函数,公式,数组,数组公式的概念...
各位好,从今日开始,在平台上我将推出VBA解决方案系列丛书的第三部:VBA数组与字典解决方案,这套书从工作表数组开始讲解,逐渐过渡到VBA数组和VBA字典,在这部教程中,大家会看到VBA数组.字典在各 ...
- 数组字典_VBA数组与字典解决方案第34讲:数组的传递
大家好,今日我们继续讲解VBA数组与字典解决方案,今日讲解的是第34讲:数组的传递.在应用数组的时候,我们往往需要要把数组的值由一个数组传递给另外一个数组,就如同变量的传递一样: A=B '把B值赋给 ...
- linux shell数组与字典用法总结
shell里面也有数组和所谓的字典,数组分为索引数组和关联数组(关联数组也就是在其他语言里面的字典,在数组和字典的操作方式基本一致). 1. 数组 1.1 创建数组 - 创建空数组 `names=() ...
- Linux shell 中的数组和关联数组
写在前面的话 我用开始废柴了,这个又是写给我自己看的了. 普通数组 1.数组的定义 在Linux shell中定义一个普通的数组很简单,首先我们先给数组命名(当然要符合所有的命名规则咯).定义数组的一 ...
- linux shell 创建序列数组(list,array)方法
from: http://www.cnblogs.com/chengmo/archive/2010/10/14/1851517.html 关于linux数组定义,以及生成方法,请看:linux she ...
- linux shell编程学习——数组使用
linux的shell的编程方面很强大,最近在写脚本的时候,需要用到shell的数组.下面对最近的学习和使用做个简单的总结. 定义 linux的数组分两种,一种是普通的下标数组,一种是关联数组.前者和 ...
- linux shell 字符串 数组,bash shell函数返回数组字符串
#!/bin/bash # script:getselfvar.sh # 每个脚本中都在末尾追加了一段特殊的域名ip序列,需要将这段序列存放到数组变量中,供 # 脚本使用,例子中的ip和域名是处理过的 ...
- Linux centosVMware shell中的函数、shell中的数组、
一.shell中的函数 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可. 格式: function _name() { command ...
- Linux基础:Shell脚本学习
一.shell简介 Shell是用户和Unix/Linux内核沟通的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释和执行 ...
最新文章
- 搜索引擎Killed原因排查
- java运行在用户态_理解Linux用户态和内核态
- C语言中的static 详细分析
- 修正discuz发帖首次换行无效的问题
- 测试工程师听了想打人
- 吃奶酪(洛谷-P1433)
- 初入C++(二)类和对象,构造函数,析构函数
- 让孩子从小自信的28个方法
- mac 截图快捷键
- 2×3卡方检验prism_戏说卡方检验
- /proc/meminfo之谜
- 最大功率点跟踪测试软件,最大功率点跟踪控制压电能量获取系统
- Win10首次开机设置
- 如何配置线上生产服务器环境(密匙登录、防火墙 、Node、Nginx、MongoDB、Redis、Mysql、PHP、JDK、Tomcat等)
- 常用英语后缀和全部英语后缀——190个
- 微信公众号--生成带参数的二维码 {“errcode“:48001,“errmsg“:“api unauthorized rid: 60520af9-71ff2283-63d36e0d“}
- scrapy框架的使用
- python 为女神编朵玫瑰花的代码,python绘制玫瑰的代码
- w10系统打不开服务器共享打印机,win10系统无法共享打印机的方案
- 搞了一天存储过程,现在又说历史数据不用处理了。。。
热门文章
- 解决 select2 开启 tags 输入中文显示不全的BUG
- 以小组为单位,设计一个Windows应用程序,在该程序中定义一个学生类和班级类,以处理学生的学号,姓名,语文,数学和英语3门课程的期末考试成绩。
- 通信行业专业-行业专业词汇
- 计算机网络——7层OSI网络模型
- 澳门大学计算机语言博士生导师王珊,博士招生 | 澳门大学王珊招收语言学等方向学生...
- 利用协同过滤算法的皮尔逊系数:计算歌曲相似度
- 网页添加Live2D看板娘简易教程
- SpringBoot+vue实现前后端分离的餐厅点餐系统
- Python pta 7-3 s=1+2+3+...+n直到s>=m
- ProcessOn - 高大上的免费中文在线作图工具/思维导图制作软件