本文也即《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 之数组 [转]的更多相关文章

  1. 每天一个shell知识--数组

    1.shell中数组的定义: 数组名=(value value1 value2 ) 也可以单独的设定数组的分量: arrayL[0]=value arrayL[1]=value1 2.${arrayL ...

  2. Linux shell之数组

    引言 在Linux平台上工作,我们经常需要使用shell来编写一些有用.有意义的脚本程序.有时,会经常使用shell数组.那么,shell中的数组是怎么表现的呢,又是怎么定义的呢?接下来逐一的进行讲解 ...

  3. linux shell 中数组使用方法介绍

    linux shell在编程方面比windows 批处理强大太多,不管是在循环.运算.已经数据类型方面都是不能比較的. 以下是个人在使用时候,对它在数组方面一些操作进行的总结. 1.数组定义 [che ...

  4. shell脚本-数组

    shell脚本-数组 数组 变量:存储单个元素的内存空间. 数组:存储多个元素的连续的内存空间,相当于多个变量的集合. 数组索引:编号从0开始,属于数值索引.索引可支持使用自定义的格式,而不仅是数值格 ...

  5. Shell 编程 数组

    本篇主要写一些shell脚本数组的使用. 数组定义 数组名=(value0 value1 vlaue2 ...) 数组名=([0]=value [1]=value [2]=vlaue ...) 列表名 ...

  6. 我们一起来学Shell - shell的数组

    文章目录 什么是数组 数组中常用变量 数组的定义 小括号定义数组变量 小括号加键值对定义数组变量 分别定义数组变量 动态地定义数组变量 数组赋值的切片 遍历数组 关联数组 我们一起来学Shell - ...

  7. shell之数组

    1.从数组的下标分为索引数组.关联数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 /* 索引数组,即通常情况下所说的数组 */ var ary1 = [1,3,5, ...

  8. shell中数组讲解

    定义数组 在Shell中,用括号来表示数组,数组元素用"空格"符号分割开.定义数组的一般形式为: 代码如下: 数组名=(值1 值2 ... 值n) 例如: 代码如下: array_ ...

  9. [ SHELL编程 ] 数组、关联数组和awk数组

    本文主要对shell编程中常用的数组.关联数组和awk数组定义.操作以及注意事项做个总结,并提供具体案例. 数组 数组定义:一对圆括号表示数组,数组元素之间用空格符号分割. Array=(val1 v ...

随机推荐

  1. 获取oracle 表字段,表名,以及主键之类等等的信息。

    获取表名:  Oracle的user_talbes用于记录了用户表信息. select * from user_tables  获取某个表的字段: USER_TAB_COLS中记录了用户表的列信息.下 ...

  2. 【Spring】Spring系列6之Spring整合Hibernate

    6.Spring整合Hibernate 6.1.准备工作 6.2.示例 com.xcloud.entities.book com.xcloud.dao.book com.xcloud.service. ...

  3. RTX登录其他系统

    前台: <html> <head> <title>签名验证</title> <meta http-equiv="Content-Lang ...

  4. Java for LeetCode 166 Fraction to Recurring Decimal

    Given two integers representing the numerator and denominator of a fraction, return the fraction in ...

  5. JPush开发

    主要功能 保持与服务器的长连接,以便消息能够即时推送到达客户端 接收通知与自定义消息,并向开发者App 传递相关信息 SDK集成步骤 1.导入 SDK 开发包到你自己的应用程序项目 解压缩 jpush ...

  6. POSIX线程--同时执行

    //#define _REENTRANT//#define _POSIX_C_SOURCE#include <iostream>#include <string>#includ ...

  7. 一、HTML和CSS基础--HTML+CSS基础课程--第2部分

    第三章 与浏览器交互,表单标签 使用表单标签,与用户交互
网站怎样与用户进行交互?答案是使用HTML表单(form).表单是可以把浏览者输入的数据传送到服务器端,这样服务器端程序就可以处理表单传过来的 ...

  8. SQL 查询CET使用领悟

    用到sql的遍历循环查询,如果不考虑用CET,估计又到了自己造轮子的时代了,现在觉得sql的CET确实是个好东西,针对SQL的递归查询,很是不错的方法: with etcRecommandINfo2( ...

  9. MATLAB中 feval 函数的用法

    feval就是把已知的数据或符号带入到一个定义好的函数句柄中,你看看下面的例子 syms tf=@(x,y) x^2+y^2k1=feval(f,1,t)k2=f(1,t)k3=feval(f,1,1 ...

  10. 使用 Docker 建立 Mysql 集群

    软件环境介绍操作系统:Ubuntu server 64bit 14.04.1Docker 版本 1.6.2数据库:Mariadb 10.10 (Mariadb 是 MySQL 之父在 MySQL 被 ...