Shell 之数组 [转]
本文也即《Learning the bash Shell》3rd Edition的第六章Command-Line Options and Typed varilables之读书笔记之三,但我们将不限于此。数组元素可以是string或者数字,同变量一样。数组的index从0开始计算,最大可以为 599147937791。基本上可以认为没有限制。
定义方式
可以直接进行赋值
name[2]=two
name[0]=zero
name[1]=one
与上面方式一样,这里我们没有按顺序进行赋值。name=([2]=alice [0]=hatter [1]=duchess)
。如果我们按顺序进行赋值,可以不需要说明index,name=(a b c)
。如果我们其中有一个不依次赋值,可以指明,如name=(a [3]=b c)
,b赋值给index=3的元素,c按顺序赋值给下一个,即index=4。
如果我们定义一个空的数组,可以使用declare –a name
来声明。变量用${array
[i
]}
,如果没有指明index,则返回第0个元素。
重置和取消
我们使用组合方式定义,即array=(…)的方式时,如果前面已经定义了数组,将重置整个数组。
如果我们要取消某个元素,可以使用unset array
[i]
,如果我们要出现整个数组,可以使用unset array
,或者unset array
[@]
和unset array
[*]
。
@,*和#
和位置参数一样,也可以使用@和*,使用*的时候,间隔为IFS。在上面的例子中echo ${name[@]}为zero one two。这可以用for的循环中:
for entry in "${name[@]}"; do
echo --$entry--
done
如果index不存在,没有赋值,返回null,在${array[@]}中,不包含这些元素,只有有效值。例如:
table=([1]=one [3]=three)
#${array
[@]}获取所有元素内容信息
echo ${table[@]}
#${!array
[@]}获取所有元素序号信息
echo ${!table[@]}
for entry in ${table[@]}; do
echo ==$entry==
done
运行结果如下:
one three
1 3
==one==
==three==
如果需要每个元素都显现,可以使用for((i=0;i<=3;i++))
的方式。
#是长度的操作,${#array
[i
]}
将返回第i元素的字符串的长度。而${#array
[@]}
则返回有效元素的格式,例如上面的例子中${#table[@]}为2。
例子一
:利用/etc/passwd,通过用户ID获取用户名:
for entry in $(cut -f 1,3 -d: /etc/passwd); do
#${entry#*:}是前面的用户ID,${entry%:*}是后面的用户名
echo "set array[${entry#*:}]=${entry%:*}"
array[${entry#*:}]=${entry%:*}
done
echo "User ID $1 is ${array[$1]}."
echo "There are currently ${#array[@]} user accounts on the system."
例子二
:冒泡算法
#设置数组values
values=(39 5 36 12 9 3 2 30 4 18 22 1 28 25)
#获取values的个数
numvalues=${#values[@]}
#显示当前数组的值,用于跟踪
function showvalues
{
for (( k=0; k < numvalues; k++)); do
echo -ne "${values[$k]} "
done
echo
}
#冒泡算法
:将被排序的记录数组R[1..n]垂直排列,每个记录R看作是重量为R.key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。
function bubble
{
for (( i=0; i < numvalues; i++));do
ischanged=false
for((j=numvalues-1; j> i; j--));do
# 如果轻的在下交换之,每次i的循环,都可以见最轻的放置在最上,并调整其他的位置,使之更为有序
if [ ${values[j]} -lt ${values[j-1]}
];then
temp=${values[j]}
values[j]=${values[j-1]}
values[j-1]=$temp
ischanged=true
fi
done
showvalues
#如果已经不需要调整,即有序,就跳出循环。if [ ischanged = "false" ] ;then
break;
fi
done
}
Shell 之数组 [转]的更多相关文章
- 每天一个shell知识--数组
1.shell中数组的定义: 数组名=(value value1 value2 ) 也可以单独的设定数组的分量: arrayL[0]=value arrayL[1]=value1 2.${arrayL ...
- Linux shell之数组
引言 在Linux平台上工作,我们经常需要使用shell来编写一些有用.有意义的脚本程序.有时,会经常使用shell数组.那么,shell中的数组是怎么表现的呢,又是怎么定义的呢?接下来逐一的进行讲解 ...
- linux shell 中数组使用方法介绍
linux shell在编程方面比windows 批处理强大太多,不管是在循环.运算.已经数据类型方面都是不能比較的. 以下是个人在使用时候,对它在数组方面一些操作进行的总结. 1.数组定义 [che ...
- shell脚本-数组
shell脚本-数组 数组 变量:存储单个元素的内存空间. 数组:存储多个元素的连续的内存空间,相当于多个变量的集合. 数组索引:编号从0开始,属于数值索引.索引可支持使用自定义的格式,而不仅是数值格 ...
- Shell 编程 数组
本篇主要写一些shell脚本数组的使用. 数组定义 数组名=(value0 value1 vlaue2 ...) 数组名=([0]=value [1]=value [2]=vlaue ...) 列表名 ...
- 我们一起来学Shell - shell的数组
文章目录 什么是数组 数组中常用变量 数组的定义 小括号定义数组变量 小括号加键值对定义数组变量 分别定义数组变量 动态地定义数组变量 数组赋值的切片 遍历数组 关联数组 我们一起来学Shell - ...
- shell之数组
1.从数组的下标分为索引数组.关联数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 /* 索引数组,即通常情况下所说的数组 */ var ary1 = [1,3,5, ...
- shell中数组讲解
定义数组 在Shell中,用括号来表示数组,数组元素用"空格"符号分割开.定义数组的一般形式为: 代码如下: 数组名=(值1 值2 ... 值n) 例如: 代码如下: array_ ...
- [ SHELL编程 ] 数组、关联数组和awk数组
本文主要对shell编程中常用的数组.关联数组和awk数组定义.操作以及注意事项做个总结,并提供具体案例. 数组 数组定义:一对圆括号表示数组,数组元素之间用空格符号分割. Array=(val1 v ...
随机推荐
- 《ASP.NET1200例》C# WINFORM程序的三层架构如何建立的。
先添加-新建项目-windows应用程序,然后在右边的解决方案资源管理器上面,在当前的解决方案上面右击,点,添加-新建项目-类库,分别建立.DAL,BLL,Model三个项目,然后,在DAL项目上右击 ...
- Android简易数据存储之SharedPreferences
Andorid提供了多种数据存储的方式,例如前面说到的“Android数据存储之SQLite的操作”是用于较复杂的数据存储.然而,如果有些简单的数据存储如果采用SQLite的方式的话会显得比较笨重.例 ...
- cocos2d-x如何解决图片显示模糊问题
转载http://zhidao.baidu.com/link?url=JTUKP5quGfMQixLZSvtC2XlKMkQDyQbYW72_DRyD6KDRpkLs8_6poQtKkwsyqzU8q ...
- svn 切换默认用户名
2015年1月19日 15:37:30\ 原文: http://www.2cto.com/os/201307/229325.html linux svn切换用户 1. 临时切换 在所有命令下强 ...
- 5.前端笔记之jquery部分
一.简介 jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more(写得更少,做得更多).jQuery在2006年1月由美国人John Resig在纽约的 ...
- codeforces 471C.MUH and House of Cards 解题报告
题目链接:http://codeforces.com/problemset/problem/471/C 题目意思:有 n 张卡,问能做成多少种不同楼层(floor)的 house,注意这 n 张卡都要 ...
- 如何在Win8系统上建立WIFI热点
1.首先将鼠标移到桌面左下角,单击右键,在弹出的快捷菜单中找到“命令提示符(管理员)”,点击 2.点击后,系统就以管理员权限打开了命令提示符,在命令提示符中输入以下命令“netsh wlan set ...
- Linux命令行下创建纳入版本控制下的新目录
[root@ok 资料库]# svn mkdir test A test [root@ok 资料库]# svn ci -m "mkdir test" Adding 资料库/test ...
- poj 3281 最大流+建图
很巧妙的思想 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/21/2649850.html 本题能够想到用最大流做,那真的是太绝了.建模的方法很 ...
- struts2文件下载,动态设置资源地址
转自:http://blog.csdn.net/ctrl_shift_del/article/details/6277340 ServletActionContext.getServletContex ...