Shell 之数组 [转]

简介: 本文也即《Learning the bash Shell》3rd Edition的第六章Command-Line Options and Typed varilables之读书笔记之三,但我们将不限于此。

本文也即《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
}

目录
相关文章
|
6月前
|
Shell 索引
shell脚本入门到实战(四)- 数组
shell脚本入门到实战(四)- 数组
|
Shell 索引
shell编程之数组
shell编程之数组
72 0
|
25天前
|
存储 Shell
Shell 数组
【10月更文挑战第16天】
28 3
|
29天前
|
Shell PHP 索引
Shell 数组
10月更文挑战第2天
21 1
|
3月前
|
Shell KVM 虚拟化
Shell 数组编程
【8月更文挑战第22天】 Shell 数组编程
48 10
|
6月前
|
存储 算法 安全
shell 脚本之 函数与数组
shell 脚本之 函数与数组
|
5月前
|
存储 Shell 开发者
Shell 数组:灵活操作的秘诀
**Shell 数组简介**:作为基础数据结构,数组在Shell编程中不可或缺。它们存储多个值,下标从0开始。创建如`array=(值1 值2...)`,访问用`${array[index]}`。增删改查及获取长度、拼接数组都有相应语法,例如`unset array[index]`删除元素,`${#array[@]}`获取长度。通过实践这些操作,提升Shell脚本技能。
41 0
|
5月前
|
Shell Linux
linux shell 脚本实现:根据文件内容中的每行分隔符放入数组,根据规则打印日志并重新创建目录 备份文件
linux shell 脚本实现:根据文件内容中的每行分隔符放入数组,根据规则打印日志并重新创建目录 备份文件
51 0
|
5月前
|
Shell Linux
linux shell脚本字符串 字段分隔符 存入数组 根据下标取值
linux shell脚本字符串 字段分隔符 存入数组 根据下标取值
65 0
|
6月前
|
运维 Shell Python
第五章 Shell函数与数组
第五章 Shell函数与数组