linux中SHELL脚本中的数组用法

在Shell中(我这里是Bash),其实没有传统意义上的“数据类型”,把任何变量中存的值都是作为字符组成的“字符串”。当然,通过declare可以声明某个变量是整型、数组等类型。其中,数组就是本文要专门讲的了。在Bash中,仅支持一维数组,当然通过关联数组(associative array)的形式可以模拟多维数组。

1. 数组的声明
用 declare -a array 声明array是一个数组,用declare -A a_array 声明a_array是一个关联数组。
在Shell中,declare声明数组不是必需的。

2. 数组的初始化(赋值)
在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为:array_name=(value0, value1, … valueN)
也可单独对各个元素进行赋值,如:array[0]=foo; array[3]=bar (可以不使用连续的下标,而且下标的范围没有限制)

3. 访问数组的元素
使用 array_name=(value0, value1, …) 格式初始化的数组,其下标从0开始,使用 ${array_name[index]} 格式访问数组中某个下标的元素。
${array_name[@]} 和 ${array_name[*]} 表示数组中的所有元素,区别是${数组[@]}得到是以空格隔开的元素,而${数组[*]}得到一整个字符串。(这个区别和$@、$* 表示脚本的传参列表类似的)

4. 数组的长度(元素的个数)和元素的字符串长度
数组的长度就是元素的个数,通过 ${#array_name[@]} 或 ${#array_name[*]} 获取;其中某个元素的字符串长度 ${#array_name[index]} 。

5. 数组的截断
{array_name[@]:1} 表示除了第1个元素(小标0)之外的所有元素
{array_name[@]:1:4} 表示第2、3、4个(下标为1,2,4-1)元素

6. 取消数组元素或整个数组
取消定义数组 unset array_name
取消数组中的某个元素 unset array_name[index]

7. 关联数组、多维数组
关联数组可以模拟任意多维的数组。 见代码:https://github.com/smilejay/shell/blob/master/sh2016/fake_two_demensinal_array.sh

根据上面的介绍的一个示例Shell脚本如下,去运行和修改一下,可以帮助大家理解Shell中的数组:

#!/bin/bash
#use array in Bash script
array1=(Alpha Beta Gamma)
echo "array1[0]: ${array1[0]}"
echo "array1[1]: ${array1[1]}"
echo "len of array1: ${#array1[@]}"
echo "len of array1: ${#array1[*]}"
echo "len of array1[0]: ${#array1[0]}"
echo "\${array1[@]}: ${array1[@]}"
echo "\${array1[*]}: ${array1[*]}"
echo "\${array1[@]1}: ${array1[@]:1}"
echo "\${array1[@]1}: ${array1[@]:0:2}"
 
echo ""
echo "for in \${array1[@]}:"
for i in "${array1[@]}"
do
 echo $i
done
echo ""
echo "for in \${array1[*]}:"
for i in "${array1[*]}"
do
 echo $i
done
echo ""
 
unset array1[0]
echo "\${array1[@]: ${array1[@]}"
echo ""
 
array2[0]=11
array2[1]=22
array2[3]=Foo
 
echo "array2: ${array2[@]}\n"
 
 
ls_out=($(ls *.sh))
echo "len of ls_out is ${#ls_out[@]}"
for i in $(seq 0 $((${#ls_out[@]}-1)))
do
 echo "ls_out[${i}] ${ls_out[$i]}"
done

例子

数组定义、遍历

数组定义:

arr=(1 2 3 4 5) # 注意是用空格分开,不是逗号!!

数组定义法2:

array
array[0]="a"
array[1]="b"
array[2]="c"

获取数组的length(数组中有几个元素):

${#array[@]}

遍历(For循环法):

for var in ${ arr[@] };
do
    echo $var
done

遍历(带数组下标):

for i in "${!arr[@]}"; do
    printf "%s\t%s\n" "$i" "${arr[$i]}"
done

遍历(While循环法):

i=0
while [ $i -lt ${ #array[@] } ]
do
    echo ${ array[$i] }
    let i++
done
向函数传递数组:

由于Shell对数组的支持并不号,所以这是一个比较麻烦的问题。

翻看了很多StackOverFlow的帖子,除了全局变量外,无完美解法。

这里提供一个变通的思路,我们可以在调用函数前,将数组转化为字符串。
在函数中,读取字符串,并且分为数组,达到目的。

fun() {
        local _arr=(`echo $1 | cut -d " "  --output-delimiter=" " -f 1-`)
        local _n_arr=${#_arr[@]}
        for((i=0;i<$_n_arr;i++));
        do 
                elem=${_arr[$i]}
                echo "$i : $elem"
        done;
}
 
array=(a b c)
fun "$(echo ${array[@]})"

时间: 2024-11-10 05:29:10

linux中SHELL脚本中的数组用法的相关文章

Linux/Unix shell 脚本中调用SQL,RMAN脚本

        Linux/Unix shell脚本中调用或执行SQL,RMAN 等为自动化作业以及多次反复执行提供了极大的便利,因此通过Linux/Unix shell来完成Oracle的相关工作,也是DBA必不可少的技能之一.本文针对Linux/Unix shell脚本调用sql, rman 脚本给出了相关示例.   一.由shell脚本调用sql,rman脚本 1.shell脚本调用sql脚本 #首先编辑sql文件 oracle@SZDB:~> more dept.sql connect

详解Linux交互式shell脚本中创建对话框实例教程

当你在终端环境下安装新的软件时,你可以经常看到信息对话框弹出,需要你的输入.对话框的类型有密码箱,检查表,菜单,等等.他们可以引导你以一种直观的方式输入必要的信息,使用这样的用户友好的对话框的好处是显而易见的.如下图所示:     当你写一个交互式shell脚本,你可以使用这样的对话框来接受用户的输入.whiptail可以在shell脚本中创建基于终端的对话框,消息框的过程,类似于Zenity或xdialog GUI脚本代码.预先安装在所有的Linux发布版本中. 下面来看看whiptail的用

linux 在shell脚本中获取该脚本的所在绝对路径

脚本名:a.sh 位置:/tmp/whuang/study/Java 脚本内容:   Shell代码   #!/bin/sh   this_dir=`pwd`   dirname $0|grep "^/" >/dev/null   if [ $? -eq 0 ];then                   this_dir=`dirname $0`   else           dirname $0|grep "^\." >/dev/null  

linux 在shell脚本中获取该脚本的所在绝对路径2

脚本名:a.sh 位置:/tmp/whuang/study/Java 脚本内容: Shell代码   this_dir=`pwd`   file_name=`basename $0`   dirname $0|grep "^/" >/dev/null   if [ $? -eq 0 ];then       this_dir=`dirname $0`   else           dirname $0|grep "^\.\." >/dev/null 

Linux下Shell脚本中几种基本命令的替换区别_linux shell

Part 1 : ` command ` 这是 "命令标准输出作为函数标准输入" 操作方法之一,有很大的弊端以及不安全的地方. 缺点一:比较陈旧. 缺点二:容易与单引号混淆.(其实它是你键盘"!"左边那个键) Part 1.5 ` command``与 $(command) 俩者区别 直接看几张图吧,看这图解释他们区别... 大家可以看到俩种表达方式,分别是代表命令直接执行和嵌套执行. 我们发现:执行`` 和 $() 是相同的. 附,其实这里有个小bug...( 橙

Linux下将数据文件的指定域读取到shell脚本中

这个例子说明了怎样在Linux下shell脚本中从数据文件读取特定的域(field)并进行操作.例如,假设文件employees.txt的格式是{employee-name}:{employee-id}:{department-name},以冒号进行划分,如下所示. $ cat employees.txt Emma Thomas:100:Marketing Alex Jason:200:Sales Madison Randy:300:Product Development Sanjay Gupt

linux 下shell脚本调用 (小白求教)

问题描述 linux 下shell脚本调用 (小白求教) Shell脚本怎么实现调用一个可执行文件并在脚本中执行该文件中的命令? (可执行文件打开后是命令行模式) 解决方案 啥意思?脚本里调用脚本?直接以廖本名调用啊 解决方案二: 这个是不是类似,在shell命令行窗口中打开另外一个命令行? 解决方案三: 用fork,system等,可以获取它的管道输出等 解决方案四: 文件中的命令? 没明白什么意思? 解决方案五: 可以尝试使用source函数................. 解决方案六:

Linux/Unix shell 脚本跨服务器跨实例执行SQL

      在DB运维的过程中,难免碰到需要跨多个服务器以及多个Oracle实例查询数据库的情形.比如我们需要查看当前所有生产环境数据库上open_cursor参数的值以便考虑是否需要增加.而需要查看的数据库服务器上有多个实例,同时又存在多个数据库服务器,这样子下来,几十个DB,上百个的情形一个个查,那得把人给累死.那就像点办法撒,写个shell脚本,轮巡所有服务器及服务器上的所有实例.见本文的描述.      关于shell脚本中如何调用SQL,可以参考下列链接:           Linu

Linux shell脚本中连接字符串的方法

 这篇文章主要介绍了Linux shell脚本中连接字符串的方法,大家参考使用吧 如果想要在变量后面添加一个字符,可以用一下方法:   代码如下: $value1=home $value2=${value1}"=" echo $value2     把要添加的字符串变量添加{},并且需要把$放到外面. 这样输出的结果是:home=,也就是说连接成功.   又如:     代码如下: [root@localhost sh]# var1=/etc/ [root@localhost sh]#