shell数组

51 阅读5分钟

Shell数组和函数 数组中可以存放多个值。 Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。 与大部分编程语言类似,数组元素的下标由0开始。

Linux ulimit命令用于控制shell程序的资源。

ulimit [-aHS][-c <core文件上限>][-d <数据节区大小>][-f <文件大小>][-m <内存大小>][-n <文件数目>][-p <缓冲区大小>][-s <堆叠大小>][-t <CPU时间>][-u <程序数目>][-v <虚拟内存大小>]
-   -a  显示目前资源限制的设定。
-   -c <core文件上限>  设定core文件的最大值,单位为区块。
-   -d <数据节区大小>  程序数据节区的最大值,单位为KB。
-   -f <文件大小>  shell所能建立的最大文件,单位为区块。
-   -H  设定资源的硬性限制,也就是管理员所设下的限制。
-   -m <内存大小>  指定可使用内存的上限,单位为KB。
-   -n <文件数目>  指定同一时间最多可开启的文件数。
-   -p <缓冲区大小>  指定管道缓冲区的大小,单位512字节。
-   -s <堆叠大小>  指定堆叠的上限,单位为KB。
-   -S  设定资源的弹性限制。
-   -t <CPU时间>  指定CPU使用时间的上限,单位为秒。
-   -u <程序数目>  用户最多可开启的程序数目。
-   -v <虚拟内存大小>  指定可使用的虚拟内存上限,单位为KB。

显示系统资源的设置

[root@localhost ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 14974
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 14974
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

用法列子

[root@localhost ~]# ulimit -u 500    //设置单一用户程序上限

对比:
max user processes              (-u) 14974

max user processes              (-u) 500
[root@localhost ~]# ulimit -u //加上选项可以直接查看
500

数组定义方法【四种常用的】

数组里面元素的数据类型:

  • 可以是数值类型
  • 也可以是字符串类型
  • 如果是字符串类型需要加上"" ''号,单引号和双引号都可以
  • 如果说字符串中间有空格不加上引号,数组会默认为是两个字符串,加上引号后面系统就会知道是一个字符串

括号的妙用

[root@localhost ~]# echo ${i:-"abc"}
abc
[root@localhost ~]# i=123
[root@localhost ~]# echo ${i:-"abc"}
123

数组

想知道数组的长度加一个#即可实现

[root@localhost ~]# echo ${#arrag1[@]}   //$后面加上#既可以查看数组的长度
5

想查看下标的值

[root@localhost ~]# echo ${arrag1[@]}
10 20 30 40 50
[root@localhost ~]# echo ${arrag1[2]}  //更换[]里面的值就可以查看
30

获取数据列表

echo ${arrag1[*]}
echo ${arrag1[@]}

读取某下标赋值

[root@localhost ~]# arrag5=([0]=10 [1]=20 [3]=40 [4]=50)
[root@localhost ~]# echo ${arrag5[*]}
10 20 40 50
[root@localhost ~]# arrag5[4]=80  //通过编号赋值
[root@localhost ~]# echo ${arrag5[*]}
10 20 40 80

1.1方法一

数组名=(value0 value1 value2 ....)

[root@localhost ~]# array1=(10 20 30 40 50)
[root@localhost ~]# echo ${arrag1[*]}
10 20 30 40 50

[root@localhost ~]# echo ${#arrag1[@]}
5

1.2方法二

数组名=([ 0]=value [1]=value [2]=value ....)

[root@localhost ~]# arrag5=([0]=10 [1]=20 [3]=40 [4]=50)
[root@localhost ~]# echo ${arrag5[*]}  //虽然看上去是4个元素,但是40 50的下标不是3 4 了,
10 20 40 50
[root@localhost ~]# echo ${#arrag5[*]}
4
[root@localhost ~]# length=${#arrag5[*]}
[root@localhost ~]# echo ${arrag5[length-1]}  //可以判断有空的值
40

1.3方法三

列表名="value0 value1 value2 ...."

数组名=($列表名)

[root@localhost ~]# list="10 20 30 40 50"
[root@localhost ~]# echo $list
10 20 30 40 50
[root@localhost ~]# array3=($list)
[root@localhost ~]# echo $array3
10
[root@localhost ~]# echo ${array3[@]}
10 20 30 40 50

1.4方法四

数组名[0]="value"

数组名[1]="value"

数组名[2]="value"

数组名[3]="value"

[root@localhost ~]# array4[0]=10
[root@localhost ~]# array4[1]=20
[root@localhost ~]# array4[2]=30
[root@localhost ~]# array4[3]=40
[root@localhost ~]# echo ${array4[*]}
10 20 30 40

数组应用

数组切片(截取)

[root@localhost ~]# arrag1=(10 20 30 40 50)
[root@localhost ~]# echo ${arrag1[*]}  //输出整个数组
10 20 30 40 50
[root@localhost ~]# echo ${arrag1[*]:2:1}   //读取${数组名[@/*]:起始位置:长度}
30
[root@localhost ~]# echo ${arrag1[*]:2:3}
30 40 50

数组的替换

[root@localhost ~]# echo ${arrag1[*]}  
10 20 30 40 50
[root@localhost ~]# echo ${arrag1[*]/4/888}  //${数组名[*]/查找字符/替换字符
10 20 30 8880 50    
[root@localhost ~]# echo ${arrag1[*]/5/999}   //并改变原有的数组,想改变可以重新赋值
10 20 30 40 9990

[root@localhost ~]# arrag1[1]=888
[root@localhost ~]# echo ${arrag1[*]}
10 888 30 40 999
[root@localhost ~]# echo ${arrag1[*]/999/666}
10 888 30 40 666

[root@localhost ~]# arrag1[2]=888
[root@localhost ~]# arrag1[3]=885
[root@localhost ~]# echo ${arrag1[*]}
10 20 888 885 50
[root@localhost ~]# echo ${arrag1[*]/88/10}   //只要能去匹配到一样的元数,都会替换掉,单个替换时应该主意
10 20 108 105 50

数组删除

[root@localhost ~]# arrag1=(10 20 30 40 50)
[root@localhost ~]# echo ${arrag1[*]}
10 20 30 40 50
[root@localhost ~]# unset arrag1    //删除数组
[root@localhost ~]# echo ${arrag1[*]}
[root@localhost ~]# arrag1=(10 20 30 40 50)
[root@localhost ~]# echo ${arrag1[*]}
10 20 30 40 50
[root@localhost ~]# unset arrag1[2]   //删除到三个元素
[root@localhost ~]# echo ${arrag1[*]}
10 20 40 50

数组追加元素

方法一:

array_name[index]=value

[root@localhost ~]# arrag1=(10 20 30 40 50)
[root@localhost ~]# echo ${arrag1[*]}
10 20 30 40 50
[root@localhost ~]# arrag1[5]=60  //添加元素
[root@localhost ~]# echo ${arrag1[*]}
10 20 30 40 50 60

方法二:

array_name[$#array_name[*]}]=value

对于满元素状态下才能使用

[root@localhost ~]# arrag1=(10 20 30 40 50 )
[root@localhost ~]# echo ${arrag1[*]}
10 20 30 40 50
[root@localhost ~]# arrag1[${#arrag1[*]}]=60 //添加元素
[root@localhost ~]# echo ${arrag1[*]}
10 20 30 40 50 60
[root@localhost ~]# arrag1[${#arrag1[*]}]=70
[root@localhost ~]# echo ${arrag1[*]}
10 20 30 40 50 60 70

方法三:

array_name=(["${array_name=[*]}"value1...valueN)

不对满元素的添加方法

  • 双引号不能省略,否则,当数组array_name中存在包含空格的元素时会按空格将元素拆分成多个
不加引号
[root@localhost ~]# arrag1=([0]=qi qi [1]=jiu liu [2]=zhao ba [3]=lao wu [4]=wang san)
[root@localhost ~]# echo ${arrag1[*]}
qi jiu zhao lao wang san
[root@localhost ~]# echo ${#arrag1[*]}
6
加双引号
[root@localhost ~]# arrag1=([0]="qi qi" [1]="jiu liu" [2]="zhao ba" [3]="lao wu" [4]="wang san")
[root@localhost ~]# echo ${arrag1[*]}
qi qi jiu liu zhao ba lao wu wang san
[root@localhost ~]# echo ${#arrag1[*]}
5
  • 不能将"@ "替换为"*"",如果替换为"*",不加双引号时与"@"的表现一致,加双引号时,会将数组array _name中的所有元素作为一个元素添加到数组中
less
复制代码
[root@localhost ~]# arrag1=([0]="qi qi" [1]="jiu liu" [3]="lao wu" [4]="wang san")
[root@localhost ~]# echo ${#arrag1[*]}
4
[root@localhost ~]# arrag1=(${arrag1[@]}"san qi" "lao zhu")   //没有加双引号就会导致元素被拆分开
[root@localhost ~]# echo ${arrag1[*]}
qi qi jiu liu lao wu wang sansan qi lao zhu
[root@localhost ~]# echo ${#arrag1[*]}
9

[root@localhost ~]# arrag1=([0]="qi qi" [1]="jiu liu" [3]="lao wu" [4]="wang san")
[root@localhost ~]# echo ${arrag1[*]}
qi qi jiu liu lao wu wang san
[root@localhost ~]# echo ${#arrag1[*]}
4
[root@localhost ~]# arrag1=("${arrag1[@]}" "san qi" "lao zhu")     //加双引号后追加不会被拆分开
[root@localhost ~]# echo ${#arrag1[*]}
6

方法四:

array_name+=(value1...valueN)

待添加元素必须用”()”包围起来,并且多个元素用空格分隔

[root@localhost ~]# i=123
[root@localhost ~]# i+=4
[root@localhost ~]# echo $i
1234
[root@localhost ~]# let i+=5  //let是整数运算
[root@localhost ~]# echo $i
1239
[root@localhost ~]# arrag1=(10 20 30 40 50)
[root@localhost ~]# echo ${arrag1[*]}
10 20 30 40 50
[root@localhost ~]# arrag1+=(60 70)
[root@localhost ~]# echo ${arrag1[*]}
10 20 30 40 50 60 70
[root@localhost ~]# vim 30.sh
#!/bin/bash


myfunc() {
  local array1=($@)
  sum=0
  for i in ${array1[@]}
  do
    sum=$[sum + i]
  done
  echo $sum
}

arrag1=(10 20 30 40 50 60)
echo "原始数组的值列表为:${array1[@]}"

RESULT=$(myfunc ${array1[@]})

echo  "数组所有元素的累加和为:$RESULT"

原始数组的值列表为:10 20 30 40 50 60
数组所有元素的累加和为:210
#!/bin/bash


double() {
  newarr=($@)
  N=0
  for i in ${newarr[@]}
  do
    A=$[$i * 2]
    newarr1[$N]=$A
    let N++
  done
  echo ${newarr1[@]}
}

arr1=(10 20 30 40 50 60)
echo "原始数组的值列表为:${arr1[@]}"

RESULT=$(double ${arr1[@]})

echo "新的数组的值列表为:$RESULT"


[root@localhost ~]# . 30.sh
原始数组的值列表为:10 20 30 40 50 60
新的数组的值列表为:20 40 60 80 100 120
#!/bin/bash


double() {
  newarr=($@)
  N=0
  for ((i=0; i<${#newarr[@]}; i++))
  do
     newarr1[$i]=$[${newarr[$i]} * 2]
  done
  echo ${newarr1[@]}
}

arr1=(10 20 30 40 50 60)
echo "原始数组的值列表为:${arr1[@]}"

RESULT=$(double ${arr1[@]})

echo "新的数组的值列表为:$RESULT"


[root@localhost ~]# . 30.sh
原始数组的值列表为:10 20 30 40 50 60
新的数组的值列表为:20 40 60 80 100 120