linux下Bash编程之数组Array详解

1.Array数组与变量概念与区别

变量是一段内存空间,并且变量与变量之间是多数是不连续的内存空间

Array数组是由多个变量组成,数组中的变量称为元素,数组中的元素是连续的内存空间

2.声明数组

declare -a 数组名

例如:声明一个数组STU并初始化值

  写法1:

     declare -a STU

      STU[0]=Willow

      STU[1}=Tom

      STU[2]=Redhat

  写法2:

      STU=(Willow Tom Redhat) #元素之间用空格隔开,元素从0开始依次赋值,不能跳跃

  写法3:

      STU=([0]=Willow [1]=Tom [2]=Redhat)

      STU=([0]=Willow [1]=Tom [5]=Redhat) #元素可以跳跃赋值,第2,3,4元素则为空值

3.数组属性

3.1.计算数组当中指定元素的字符长度:

${#STU[0]}表示数组STU中的第1个元素的长度

${#STU[1]}表示数组STU中的第2个元素的长度

3.2.计算数组当中元素的个数

${#STU[*]}

${#STU[@]}

4.实验.将指定数组内的最大值取出来,如下脚本:

#!/bin/bash

#

ARRAY=(23 15 66 88 54 110 686 336 2 256)

declare -i MAX=${ARRAY[0]}

INDEX=$[${#ARRAY[*]}-1]

for I in `seq 1 $INDEX`; do

    if [ $MAX -lt ${ARRAY[$I]} ]; then

          MAX=${ARRAY[$I]}

    fi

done

echo "ARRAY_MAX is $MAX"

5.实验,利用RANDOM随机生成数组,并将数组内的最大值取出来,如下脚本:

#!/bin/bash

#

echo -n "ARRAY is  "

for I in {0..9}; do

  ARRAY[$I]=$RANDOM

  echo -n "${ARRAY[$I]} "

done

echo


declare -i MAX=${ARRAY[0]}

INDEX=$[${#ARRAY[*]}-1]


for I in `seq 1 $INDEX`; do

    if [ $MAX -lt ${ARRAY[$I]} ]; then

          MAX=${ARRAY[$I]}

    fi

done

echo "ARRAY_MAX is $MAX"

6.实验,随机取出指定数组中的一个元素,如下脚本:

#!/bin/bash

#

STU=(Tom Willow Jerry Cruo Xbei Roony Yibu)

#STU=([0]=Tom [1]=Willow [2]=Jerry [3]=Cruo [4]=Xbei [5]=Roony [6]=Yibu)

INDEX=$[$RANDOM%7]

echo ${STU[$INDEX]}

7.随机生成一个数组,并将数组内的元素从小到大排序,如下脚本:

#

echo -n "ARRAY is  "

for I in {0..9}; do

  ARRAY[$I]=$RANDOM

  echo -n "${ARRAY[$I]} "

done

echo


INDEX=${#ARRAY[*]} 

for (( i=0; i < $INDEX; i++ )); do

    for (( j=$i; j< $INDEX; j++ )); do

       if [ ${ARRAY[$i]} -gt ${ARRAY[$j]} ]; then

          TEMP=${ARRAY[$i]}

          ARRAY[$i]=${ARRAY[$j]}

          ARRAY[$j]=$TEMP

       fi

      done

done


echo -n "ARRAY Sorted is : "

for ((i=0;i < $INDEX; i++)); do

     echo -n "${ARRAY[$i]} "

done

echo

8.自定义生成指定数组元素个数,并且数组内的元素不能相同,并将其显示出来,如下脚本:

#!/bin/bash

#

read -p "The element number[1-50]: " ELENUM

declare -a ARRAY

function COMELE {

  local I

  for I in `seq 0 $[${#ARRAY[*]}-1]`; do

     if [ $1 -eq ${ARRAY[$I]} ]; then

          return 1

     fi

  done

  return 0

}


for I in `seq 0 $[$ELENUM-1]`; do

    while true; do

      ELEMENT=$[$RANDOM%30];

      COMELE $ELEMENT

      if [ $? -eq 0 ]; then

          break

      fi

     done

     ARRAY[$I]=$ELEMENT

     echo  "${ARRAY[$I]}"

done

9.getopts命令:是bash内置命令

  :代表参数后面必须有内容

  OPTARG:获取短选项后面的内容

  OPTIND:获取命令最后一个参数

新建opttest简单脚本,接受短选项-b或-d,了解getopts命令的用法

vim opttest.sh

while getopts ":b:d:" SWITCH; do

   case $SWITCH in

     b) echo "The option is b."

        echo $OPTARG 

        echo $OPTIND;;

     d) echo "The option is d."

        echo $OPTARG 

        echo $OPTIND;;

     \?) echo "Usage: opttest.sh [-d ARGS] [-b ARGS]" ;;

   esac

done

./optest.sh -b "OK" -d "Good"  #执行显示结果如下:

[root@www sh]# ./opttest.sh -b "OK" -d "Good"

The option is b.

OK

3

The option is d.

Good

5

[root@www sh]# 

10.制作一个创建新脚本模版的脚本文件,可自动生成脚本初期必要写的内容:

比如#!/bin/bash,描述信息,创建时间,如果创建的脚本存在,则只需编辑;如果创建的脚本不存在,

则创建模版脚本等信息

#!/bin/bash

# Name:mkscript

# Description: Create script

# Author: Willow

# Version: 0.0.1

# Datetime: 06/14/2016 08:53:00

# Usage: mkscript FILENAME

#以下这段脚本,利用getopts命令,获取-d 选项信息

while getopts ":d:" SWITCH; do

   case $SWITCH in

    d) DESC=$OPTARG;;

    \?) echo "Usage: mkscript [-d DESCRIPTION] FILENAME" ;;

   esac

done

shift $[$OPTIND-1]

#以下这段脚本,创建新脚本文件必须内容

if ! grep "[^[:space:]]" $1 &> /dev/null; then

cat > $1 << EOF

#!/bin/bash

# Name: `basename $1`

# Description: $DESC 

# Author: Willow

# Version: 0.0.1

# Datetime: `date +%F-%T`

# Usage: `basename $1`


EOF

fi

vim + $1

#以下这段脚本,如果脚本语法有错误,按提示返回编辑修改

until bash -n $1 &> /dev/null; do

  read -p "Syntax error,q|Q for quiting,else for editing: " OPTIONS

  case $OPTIONS in

    q|Q)

      echo "Quiting..."

      exit 8 ;;

    *)

      vim + $1 ;;

  esac

done

chmod +x $1