您的位置:首页 > 运维架构 > Shell

bash数组基本命令与示例解释

2014-08-03 18:53 169 查看
数组分为:数组和关联数组

数组:
数组: 数组名+索引来标记一个数组元素
数组索引的表示方式:a[index]、a[1] 、a[10](第一个是a[0],因为bash是基于C语言开发的)

关联数组:
bash 4.0以后支持微数字索引(就是可以引用个单词):这种数组称为关联数组
查看bash的版本命令:[root@ning .ssh]# bash --version

关联数组引用方式a[ning] b[hong]

声明数组方式:
declare -i表示一个整数
-a表示一个数组
-A是个关联数组

数组支持稀疏格式:就是说,赋值的时候不一定安装顺序来赋值,自动识别赋值序号

[root@ning ~]# a=([0]=ning [8]=hong [7]=liang)

数组赋值赋值:方式:
1、一次对一个元素赋值:
a[0]=$RANDOM

2、一次对全部元素赋值:(用小括号括起来,里面使用空格隔开)是按照次序赋值的。

示例:

a=(ning hong liang)
[root@ning ~]# a=(ning hong liang )
[root@ning ~]# echo ${a[0]}
ning
3、按索引进行赋值:

示例:
[root@ning ~]# a=([0]=ning [8]=hong [7]=liang)
[root@ning ~]# echo ${a[0]}
ning
[root@ning ~]# echo ${a[7]}
liang
4、命令替换赋值:

示例:

[root@ning ~]# A=($(ls /root/))
[root@ning ~]# echo ${A[9]}
install.log

[root@ning ~]# A=(/home/*)
[root@ning ~]# echo ${A[5]}
/home/ning
[root@ning ~]# echo ${A[2]}
/home/fedora
5、用户输入:
read -a 数组名字
示例:

[root@ning ~]# read -a B
A D F G H J K L
[root@ning ~]# echo ${B[0]}
A
[root@ning ~]# echo ${B[2]}
F

数组的访问:
1、用索引访问:
数组[索引号]

[root@ning ~]# echo ${a[0]}

2、数组长度
示例 :

(1)数组的字符个数
[root@ning ~]# h=fsdafsafg
[root@ning ~]# echo ${#h}
9
(2)数组的元素个数
[root@ning ~]# d=(ning hong liang)
[root@ning ~]# echo ${#d[*]}
3
或者
[root@ning ~]# d=(ning hong liang)
[root@ning ~]# echo ${#d[@]}
3
(3)数组中元素中的字符个数
[root@ning ~]# d=(ning hong liang)
[root@ning ~]# echo ${#d[3]}
5
[root@ning ~]# echo ${#d}---不加索引默认是第一个元素的字符个数
4
[root@ning ~]# echo $d------不加#号代表的显示的是第一个元素
ning

案例:生成10个随机数,保存至数组中,而后显示偶数元素
#!/bin/bash
for i in {0..9}; do
num[$i]=$RANDOM------生成随机的数

[ $[$i%2] -eq 0 ] && echo ${num[$i]}
done

从数组中挑选某元素

1、${ARRAY[@]:offset:number}:取出
切片:offset:偏移的元素个数
number:偏移后取出的个数
示例:

[root@ning ~]# d=(ning hong liang)
[root@ning ~]# echo ${d[@]:1:1}--偏移为1,取出个数为1
hong
2、${ARRAY[@]:offset}:取出偏移量后的所有元素
示例:

[root@ning ~]# d=(ning hong liang)
[root@ning ~]# echo ${d[@]:1}
hong liang
3、 ${ARRAY[@]:offset:number}:取出偏移量后的前两个元素
示例:

[root@ning ~]# d=(ning hong liang)
[root@ning ~]# echo ${d[@]:0:2}
ning hong
4、 ${ARRAY[@]}:显示所有元素([*]也可以的)
示例:

[root@ning ~]# d=(ning hong liang)
[root@ning ~]# echo ${d[@]}
ning hong liang

数组复制:
${ARRAY[@]}---显示所有元素
${#ARAY{@}}----显示所有元素的个数

$@和$*区别:

$@:每个参数当作一个独立的串(是空格分开的多个串)
$*:所有的参数当作一个串

数组复制:
示例:复制一个A数组下标为偶数的元素至一个新B数组中

#!/bin/bash
declare -a B-----声明B是个数组

A=(a0 a1 a2 a3 a4 a5 a6 a7 a8)----指明数组中的元素

echo ${A[@]}------显示下A数组中的内容。
for i in `seq 0 ${#A[@]}`; do
if [ $[$i%2] -eq 0 ]; then
num=${#B[@]}----再次统计符合条件的元素数量,并赋值给num

B[$num]=${A[$i]}----用统计的数量当作B的下标给B赋值
fi
done
echo "${ning[@]}"

删除数组中的元素:
unset ARRAY[index] ------删除一个元素或撤销变量本身

[root@ning ~]# a=(ning hong liang)
[root@ning ~]# echo ${a[@]}
ning hong liang
[root@ning ~]# unset a[1]----撤销元素
[root@ning ~]# echo ${a[@]}
ning liang
[root@ning ~]# unset a--------撤销整个变量

bash中字符串取操作
字串切片
ning='ninghongliang'
echo ${ning:2:4}----取第二个开始的后面4个字串
echo ${ning: -2}---取尾部的指定字字串
取子串:基于模式
${variable#*word}---自左而右,第一次出现的word,删除开始到此word的内容,,显示剩下的内容
${variable##*word}-----自左而右删除最后一个word出现前的内容,显示剩下的内容--贪婪模式
${variable%word*}-----自右而左,第一次出现的word,删除开始到此word的内容,,显示剩下的内容
${variable%%word*}-----自右而左删除最后一个word出现前的内容,显示剩下的内容--贪婪模式

示例:
[root@localhost ~]# file=/var/log/messages
[root@localhost ~]# echo ${file#*e}
ssages
[root@localhost ~]# echo ${file##*e}
s
[root@localhost ~]# echo ${file%e*}
/var/log/messag
[root@localhost ~]# echo ${file%%e*}
/var/log/m

bash内置查找替换:
${variable/pattern/substi}替换第一次出现
[root@ning ~]# A=`tail -1 /etc/passwd`
[root@ning ~]# echo ${A/dhcpd/ning}
ning:x:177:177:DHCP server:/:/sbin/nologin

${variable//pattern/substi}----替换所有
[root@ning ~]# echo ${A//177/188}
dhcpd:x:188:188:DHCP server:/:/sbin/nologin

${variable/#pattern/substi}------行首谋定行首替换行首
[root@ning ~]# echo ${A/#dhcpd/B}
B:x:177:177:dhcpd server:/:/sbin/nologin

${bariable/%pattern/substi}-----替换行尾谋定行尾
[root@ning ~]# echo ${A/%nologin/B}
nologin:x:177:177:DHCP server:/:/sbin/B

查找删除
${variable/pattern}--删除第一次出现
${variable//pattern}----删除所有
[root@ning ~]# echo ${A//177}
dhcpd:x:::DHCP server:/:/sbin/nologin
${bianliang/#bash}------行首谋定行首删除行首
${bianliang/%bash}-----删除行尾谋定行尾

大小写转换
小---大${bianliang^^}全部换成大写
[root@ning ~]# echo ${A^^}
DHCPD:X:177:177:DHCP SERVER:/:/SBIN/NOLOGIN
大---小${bianliang,,}全部换成小写
${bianliang,,s}---对单个子串
[root@ning ~]# echo ${A^^v}---------对变量中把所有的v转换成V
dhcpd:x:177:177:DHCP serVer:/:/sbin/nologin

变量赋值操作
${bianliang:-string}
bianliang为空或未设定,那么范围string,否则,返回biang变量的值
${bianliang:=string}
bianliang 为空或未定,那么返回string,且string赋值给变量bianliang,否则返回bianliang

为脚本使用配置文件,并确保某变量有可用值的方式
biangliang=${bianliang:-default vaule}
HOSTNAME=${HOSTNAME:-ning}

示例:读取/etc/sysconfig/network文件,利用其HOSTNAME变量的值设置主机名
#!/bin/bash
#. /etc/sysconfig/network-----调用配置文件来执行
[ -f /etc/sysconfig/network ] && source /etc/sysconfig/network-------判断加调用
HOSTNAME=${HOSTNAME:-ning}
echo $HOSTNAME

示例:打印九九乘法表

#!/bin/bash

for i in `seq 1 9`; do
for j in `seq 1 $i`; do
echo -ne "$i*$j=$[$i*$j]\t"
done
echo
done

本文出自 “奋斗的人” 博客,请务必保留此出处http://wodemeng.blog.51cto.com/1384120/1535041
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: