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