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随机生成数组,并将数组内的最大值取出来,如下脚本:
echo -n "ARRAY is "
for I in {0..9}; do
ARRAY[$I]=$RANDOM
echo -n "${ARRAY[$I]} "
echo
6.实验,随机取出指定数组中的一个元素,如下脚本:
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.随机生成一个数组,并将数组内的元素从小到大排序,如下脚本:
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
echo -n "ARRAY Sorted is : "
for ((i=0;i < $INDEX; i++)); do
echo -n "${ARRAY[$i]} "
8.自定义生成指定数组元素个数,并且数组内的元素不能相同,并将其显示出来,如下脚本:
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]}"
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 "Usage: opttest.sh [-d ARGS] [-b ARGS]" ;;
esac
./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,描述信息,创建时间,如果创建的脚本存在,则只需编辑;如果创建的脚本不存在,
则创建模版脚本等信息
# 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
d) DESC=$OPTARG;;
\?) echo "Usage: mkscript [-d DESCRIPTION] FILENAME" ;;
shift $[$OPTIND-1]
#以下这段脚本,创建新脚本文件必须内容
if ! grep "[^[:space:]]" $1 &> /dev/null; then
cat > $1 << EOF
# Name: `basename $1`
# Description: $DESC
# 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
chmod +x $1