什么是数组?
一个变量:里面存放多个变量,他们有各自的代号,但需要user自行定义数组元素的代号:
索引代号:将数组里面的元素由【0,1,2....n】来标识
关联代号:用户自定义的字符串来标识,只有bash4.0以上版本支持(本机不是所以无法测试)
数组的定义和引用:
定义数组:VAR=(value1 value2 value3 value4) 直接定义数组元素内容,系统会自动给予标识
引用数组
[[email protected] ~]# var1=(1 2 3 4 5 6) [[email protected] ~]# echo "${var1[1]}" 2 [[email protected] ~]# echo "${var1[0]}" 1 [[email protected] ~]# echo "${var1[5]}" 6
注意:数组元素之间拿空格隔开
注意:引用数组时,加${} ,[]:里面的内容是标识符
VAR1=([0]="value1" [2]="value2" [4]="value3") 定义时连同标识一起定义,没由定义的标识其元素内容默认为空值
[[email protected] ~]# VAR1=([0]=value1 [2]=value2 [3]=value3) [[email protected] ~]# echo "${VAR1[0]}" value1 [[email protected] ~]# echo "${VAR1[2]}" value2 [[email protected] ~]# echo "${VAR1[3]}" value3 [[email protected] ~]# echo "${VAR1[1]}"
其他定义方法
declare命令
-a to make NAMEs indexed arrays (if supported)
将其后的变量名称声明为索引数组,如果支持
-A to make NAMEs associative arrays (if supported)
将其后的变量名声明为关联数组,如果支持
分别定义法
WC_NAME[0]="VALUE1"
WC_NAME[1]="VALUE2"
WC_NAME[3]="VALUE4"
[[email protected] ~]# WC_NAME[0]="VALUE1" [[email protected] ~]# WC_NAME[1]="VALUE2" [[email protected] ~]# WC_NAME[3]="VALUE4" [[email protected] ~]# echo "${WC_NAME[0]}" VALUE1 [[email protected] ~]# echo "${WC_NAME[2]}"
引用整个数组中的所有元素:
${NAME[*]} 或者${NAME[@]}
[[email protected] ~]# echo "${WC_NAME[*]}" VALUE1 VALUE2 VALUE4
引用整个数组的所有元素的索引号
${!NAME[*]} 或者${!NAME[@]}
[[email protected] ~]# echo "${!WC_NAME[*]}" 0 1 3
查看数组中的元素的个数
${#NAME[*]} 或者${#NAME[@]}
[[email protected] ~]# echo "${#WC_NAME[*]}" 3
数组切片:
${NAME[*]:offset}
//显示包括offset数值(索引标识)所对应表示位置的元素及其后所有的元素
[[email protected] ~]# echo "${WC_NAME[*]:1}" VALUE2 VALUE4
${NAME[*]:offset:number}
//显示包括offset数值所对应表示位置的元素及其后共number个数的值
[[email protected] ~]# echo "${WC_NAME[*]:0:1}" VALUE1 [[email protected] ~]# echo "${WC_NAME[*]:1:1}" VALUE2
撤销数组:
unset NAME
----------------------------------------------------------------------------------------------
脚本中与用户交互的变量
位置参数变量:
$0:命令的本身,对于脚本而言,就是脚本的路径
$1,$2,...$N;脚本后面通过命令行给脚本传递的命令行参数
N>9时,引用该位置变量需要加{}即${10}
特殊变量:
[email protected]:给出的所有位置参数的列表,当使用双引号引用时,每个参数作为单独的字符串存在
[[email protected] ~]# for i in "${WC_NAME[@]}";do echo "$i"; done VALUE1 VALUE2 VALUE4
$*:给出的所有位置参数的列表,当使用双引号引用时,整个参数列表被当做一个字符串
[[email protected] ~]# for i in "${WC_NAME[*]}";do echo "$i"; done VALUE1 VALUE2 VALUE4
$#:表示除了$0,外,脚本里参数的个数
如:我们编写一个求任意俩个整数之间奇数和偶数和的脚本
#!/bin/bash
#
if [ $# -ne 2 ];then
echo "Must input two parameter"
exit 6
else
inter1=$1
inter2=$2
sum1=0
sum2=0
if [[ "$inter1" =~ [^[:digit:]] ]] || [[ "$inter2" =~ [^[:digit:]] ]];then
echo "They shoud be integers"
else
if [ $inter1 -gt $inter2 ];then
exchange=$inter1
inter1=$inter2
inter2=$exchange
fi
judgment=$[inter1%2]
for i in $(seq $inter1 2 $inter2);do
sum1=$[sum1+i]
done
for j in $(seq $[inter1+1] 2 $inter2);do
sum2=$[sum2+j]
done
if [ $judgment -eq 1 ];then
echo -e "奇数和 : $sum1\n偶数和 : $sum2"
else
echo -e "奇数和 : $sum2\n偶数和 : $sum1"
fi
fi
fi
[[email protected] ~]# bash sum1 1 9 奇数和 : 25 偶数和 : 20
其中 数字1 和 9 分别是脚本中的 $1 和 $2