三十八、SHELL编程

久未见 提交于 2020-03-09 13:29:13

1、介绍

SHELL是基于C语言开发的软件程序,默认是置于Linux内核的外层,Linux系统启动之后,会在Linux内核外层,装载一层外壳,这个外壳称为SHELL。SHELL外壳程序是位于用户使用者和Linux内核之间的,主要是用于接收用户输入的指令,并且解析命令,最终将解析之后的指令发给Linux内核,Linux内核处理完成之后,会将处理的结果返回给SHELL,SHELL会对Linux内核返回数据做解释(翻译),最终将翻译之后的信息返回给用户。Linux操作系统启动之后,使用用户和密码登录,默认会登录到SHELL终端上,用户所有的操作都是在SHELL终端来执行。
常见SHELL解释器软件有以下几种:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)

2、变量

Shell编程是非类型的解释型语言,不像C++、JAVA语言编程时需要事先声明变量。Shell给一个变量赋值,实际上就是定义了变量。在Linux支持的所有shell中,都可以用赋值符号(=)为变量赋值。Shell变量为弱类型,定义变量不需要声明类型,但在使用时需要明确变量的类型。可以使用Declare指定类型,Declare常见参数有:

+/-  "-"可用来指定变量的属性,"+"为取消变量所设的属性
-f  仅显示函数
r  将变量设置为只读
x  指定的变量会成为环境变量,可供shell以外的程序来使用
i  指定类型为数值,字符串或运算式

Shell编程中变量分为三种,分别是系统变量、环境变量和用户变量。其中系统变量在对参数判断和命令返回值判断时使用,而环境变量则主要是在程序运行时需要设置,用户变量又称为局部变量,多使用在Shell脚本内部或者临时局部使用。Shell变量名在定义时,首个字符必须为字母(a-z,A-Z),不能以数字开头,中间不能有空格,可以使用下划线(_),不能使用(-),也不能使用标点符号等。变量定义好之后,可以在前面加上$进行变量引用。

SHELL编程常见系统变量:

$0 							   当前脚本的名称
$n 							   当前脚本的第n个参数,n=1,2,…9
$* 							   当前脚本的所有参数(不包括程序本身)
$# 							   当前脚本的参数个数(不包括程序本身)
$? 							   命令或程序执行完后的状态,返回0表示执行成功
$$ 							   程序本身的PID号

SHELL编程常见环境变量:

PATH  							命令所示路径,以冒号为分割
HOME  						打印用户家目录
SHELL 						显示当前Shell类型
USER  						打印当前用户名
ID    							打印当前用户id信息
PWD   							显示当前所在路径
TERM  						打印当前终端类型
HOSTNAME      			显示当前主机名

3、条件流程控制语句

3.1 If条件判断语句

通常以if开头,fi结尾。也可加入else或者elif进行多条件的判断,if表达式如下:

if  (表达式) 
语句1
fi

If常见判断逻辑运算符:

-f	 					判断文件是否存在 eg: if [ -f filename ]
-d	 					判断目录是否存在 eg: if [ -d dir     ]
-eq						等于,应用于数字比较 equal
-ne						不等于,应用于数字比较 not equal
-lt						小于,应用于整型比较 letter
-gt						大于,应用于整型比较 greater
-le						小于或等于,应用于整型比较
-ge 					大于或等于,应用于整型比较
-a						双方都成立(and) 逻辑表达式 –a 逻辑表达式
-o						单方成立(or) 逻辑表达式 –o 逻辑表达式
-z						空字符串
||      				单方成立
&&      				双方都成立表达式
==					相等,应用于字符串比较

If判断括号区别:

(  )   用于多个命令组、命令替换、初始化数组;
(( ))  整数扩展、运算符、重定义变量值,算术运算比较;
[]  bash内部命令,[与test是等同的,正则字符范围、引用数组元素编号,不支持+-*/数学运算符,逻辑测试使用-a、-o。
[[ ]] bash程序语言的关键字,不是一个命令,[[ ]]结构比[ ]结构更加通用,不支持+-*/数学运算符,逻辑测试使用&&、||。
{}  主要用于命令集合或者范围,例如mkdir  -p  /data/201{7,8}/

3.2 for循环语句

for循环语句主要用于对某个数据域进行循环读取、对文件进行遍历,通常用于需要循环某个文件或者列表。其语法格式以for…do开头,done结尾。语法格式如下:

For  var  in  (表达式)
do
	语句1
done

3.3 While循环语句

While循环语句与for循环功能类似,主要用于对某个数据域进行循环读取、对文件进行遍历,通常用于需要循环某个文件或者列表,满足循环条件会一直循环,不满足则退出循环,其语法格式以while…do开头,done结尾。语法格式如下:

while  (表达式)
do
语句1
done

3.4 Case选择语句

Case选择语句,主要用于对多个选择条件进行匹配输出,与if elif语句结构类似,通常用于脚本传递输入参数,打印出输出结果及内容,其语法格式以Case…in开头,esac结尾。语法格式如下:

case  $1  in  
    Pattern1)
    语句1 
    ;;  
    Pattern2)
    语句2
    ;;  
    Pattern3)
    语句3
    ;;  
esac

3.5 Select选择语句

Select语句一般用于选择,常用于选择菜单的创建,可以配合PS3来做打印菜单的输出信息,其语法格式以select…in do开头,done结尾。语法格式如下:

select  I  in (表达式) 
do
语句
done

#注:传参需在执行脚本时添加  不能在选择时添加

3.6 方法

Shell允许将一组命令集或语句形成一个可用块,这些块称为Shell函数,Shell函数的作用在于只需定义一次,后期随时使用即可,无需在Shell脚本中添加重复的语句块,其语法格式以function name(){开头,以}结尾。
语法格式如下:

function name (){
        command1
command2
        ........
}
#注:方法中的参数只能接受脚本内的参数,接收可使用加{}进行参数接收,如${i}

实例:

#!/bin/bash 
#################### 
function install_nginx(){ 
        echo ${1} 
} 
PS3="Please select Install Menu:" 
select i in install_nginx install_mysql install_php 
do 
        echo $i $1 
done 

运行

[root@localhost ~]# sh select_test.sh hello_world
1) install_nginx
2) install_mysql
3) install_php
Please select Install Menu:1
install_nginx hello_world
Please select Install Menu:

3.7 read

3.7.1 基本用法

#!/bin/bash 
############################# 
echo -n "please input your name:" 
read name 
echo "Hello $name,welcome!" 

#执行
[root@localhost ~]# sh read.sh 
please input your name:cluo
Hello cluo,welcome!

3.7.2 read -p 提示符

#!/bin/bash 
############################# 
read -p  "please input your name:" name 
echo "Hello $name,welcome!" 

#执行
[root@localhost ~]# sh read.sh
please input your name:cluo
Hello cluo,welcome!                     

3.7.3 read -p 提示符

#!/bin/bash 
############################# 
read -p  "please input your name:" name1 name2 
echo "Hello $name1,$name2 welcome!"

#执行
[root@localhost ~]# sh read.sh
please input your name:cluo meixi
Hello cluo,meixi welcome!

3.7.4 不指定变量,将会将所接收到的数据都存放在特殊环境变量REPLY中

#!/bin/bash 
############################# 
read -p  "please input your name:" 
select i in $REPLY 
do 
        echo $i 
done 

#执行
[root@localhost ~]# sh read.sh
please input your name:cluo meixi luoben
1) cluo
2) meixi
3) luoben

3.7.5 read -t 超时

#!/bin/bash 
############################# 
if read -t 5 -p "please input your name:" name 
then 
        echo "Hello $name ,Welcome!" 
else 
        echo 
        echo "timeout!" 
fi 

#执行
[root@localhost ~]# sh read.sh
please input your name:cluo
Hello cluo ,Welcome!
#五秒不输入
[root@localhost ~]# sh read.sh
please input your name:
timeout!

3.7.6 read -n 读取字符数

#!/bin/bash 
############################# 
read -n1 -p "please input your choose[Y/N]:" opt  
case $opt in 
        Y | y ) 
        echo
        echo "I love cluo" 
        ;; 
        N | n ) 
        echo
        echo "I love meixi" 
        ;; 
esac 

#执行
 [root@localhost ~]# sh read.sh
please input your choose[Y/N]:y
I love cluo

3.7.7 隐藏

#!/bin/bash 
############################# 
read -s -p "please input your passwd:" passwd 
        echo 
        echo "your passwd is $passwd"  

#执行
[root@localhost ~]# sh read.sh
please input your passwd:
your passwd is 123

3.7.8 读取文本

#!/bin/bash 
############################# 
COUNT=1 
cat test.txt | while read line 
do 
        echo "This is line$COUNT:$line" 
        COUNT=$[ $COUNT + 1] 
done 

#执行
[root@localhost ~]# sh read.sh 
This is line1:I
This is line2:LOVE
This is line3:CHINA

4、四剑客

4.1 Find

Find工具主要用于操作系统文件、目录的查找,其语法参数格式为:

find path -option [ -print ] [ -exec -ok command ] { } ;

option 常用参数详解:

-name   filename    			#查找名为filename的文件;
-type    b/d/c/p/l/f			    #查找块设备、目录、字符设备、管道、符号链接、普通文件;
-size      n[c]     			#查长度为n块[或n字节]的文件;
-perm               			#按执行权限来查找;
-user    username   			#按文件属主来查找;
-group   groupname  			#按组来查找;
-mtime    -n +n     			#按文件更改时间来查找文件,-n指n天以内,+n指n天以前;
-atime    -n +n     			    #按文件访问时间来查找文件;
-ctime    -n +n     			    #按文件创建时间来查找文件;
-mmin     -n +n     			    #按文件更改时间来查找文件,-n指n分钟以内,+n指n分钟以前;
-amin     -n +n     			    #按文件访问时间来查找文件;
-cmin     -n +n     			    #按文件创建时间来查找文件;
-maxdepth						#查找目录级别深度。

实例:

find   /data/    -name   "*.txt"     		#查找/data/目录以.txt结尾的文件;
find   /data/    -name   "[A-Z]*"    		#查找/data/目录以大写字母开头的文件;
find   /data/    -name   "test*"     		#查找/data/目录以test开头的文件;

find   /data/    -type d   				#查找/data/目录下的文件夹;
find   /data/    !   -type   d    		#查找/data/目录下的非文件夹;
find   /data/    -type  l   			#查找/data/目录下的链接文件。
find  /data/ -type d|xargs chmod 755 -R 	#查目录类型并将权限设置为755;
find  /data/ -type f|xargs chmod 644 -R 	#查文件类型并将权限设置为644;

find   /data/    -size   +1M              #查文件大小大于1Mb的文件;
find   /data/    -size   10M            	#查文件大小为10M的文件;
find   /data/    -size   -1M            	#查文件大小小于1Mb的文件;

atime,access time  	文件被读取或者执行的时间;
ctime,change time  	文件状态改变时间;
mtime,modify time  	文件内容被修改的时间;
find /data/ -mtime +30 	-name 	"*.log"  #查找30天以前的log文件;
find /data/ -mtime -30 	-name 	"*.txt"  	#查找30天以内的log文件;
find /data/ -mtime 30 	-name  	"*.txt"	#查找第30天的log文件;
find /data/ -mmin  +30	-name  	"*.log"  #查找30分钟以前修改的log文件;
find /data/ -amin  -30 	-name  	"*.txt"  	#查找30分钟以内被访问的log文件;
find /data/ -cmin  30 	-name  	"*.txt"	#查找第30分钟改变的log文件。

#查找/data目录以.log结尾,文件大于10k的文件,同时cp到/tmp目录;
find /data/  -name "*.log"  -type f  -size +10k -exec cp {} /tmp/ \;
#查找/data目录以.txt结尾,文件大于10k的文件,权限为644并删除该文件;
find /data/ -name "*.log"  –type f  -size +10k  -perm 644 -exec rm –rf {} \;
#查找/data目录以.log结尾,30天以前的文件,大小大于10M并移动到/tmp目录;
find /data/ -name "*.log"  –type f  -mtime +30 –size +10M -exec mv {} /tmp/ \;

4.2 SED

SED是一个非交互式文本编辑器,它可对文本文件和标准输入进行编辑,标准输入可以来自键盘输入、文本重定向、字符串、变量,甚至来自于管道的文本,与VIM编辑器类似,它一次处理一行内容,Sed可以编辑一个或多个文件,简化对文件的反复操作、编写转换程序等。在处理文本时把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),紧接着用SED命令处理缓冲区中的内容,处理完成后把缓冲区的内容输出至屏幕或者写入文件。如果输出到屏幕,实际文件内容并没有发生改变,除非使用重定向存储输出或写入文件。其语法参数格式为:

sed [-options] [‘Commands’] filename;
sed工具默认处理文本,文本内容输出屏幕已经修改,但是文件内容其实没有修改,需要加-i参数即对文件彻底修改;

option 常用参数详解:

x                   		#x为指定行号;
x,y                 		    #指定从x到y的行号范围;
/pattern/           		    #查询包含模式的行;
/pattern/pattern/   		        #查询包含两个模式的行;
/pattern/,x         		    #从与pattern的匹配行到x号行之间的行;
x,/pattern/         		    #从x号行到与pattern的匹配行之间的行;
x,y!                		    #查询不包括x和y行号的行;
r                			#从另一个文件中读文件;
w                			#将文本写入到一个文件;
y                			#变换字符;
q             				#第一个模式匹配完成后退出;
l                			#显示与八进制ASCII码等价的控制字符;
{}              			    #在定位行执行的命令组;
p                			#打印匹配行;
=                			#打印文件行号;
a\              			    #在定位行号之后追加文本信息;
i\              			    #在定位行号之前插入文本信息;
d                			#删除定位行;
c\              			    #用新文本替换定位文本;
s                			#使用替换模式替换相应模式;
n                			#读取下一个输入行,用下一个命令处理新的行;
N                           #将当前读入行的下一行读取到当前的模式空间。

实例:

#替换cluo.txt文本中old为new
sed 's/old/new/g' cluo.txt

#打印cluo.txt文本第一行至第三行
sed -n '1,3p' cluo.txt

#打印cluo.txt文本第一行与最后一行
sed -n '1p;$p' cluo.txt

#删除cluo.txt第一行至第三行
sed '1,3d' cluo.txt

#删除cluo.txt中匹配行至最后一行
sed '/hello/,$d' cluo.txt

#删除cluo.txt最后一行
sed '$d' cluo.txt

#删除cluo.txt最后6行
for i in `seq 1 6`; do sed -i '$d' cluo.txt; done

#在cluo.txt查找cluo所在行,并在其下一行添加word字符,a表示在其下一行添加字符串
sed '/cluo/aword' cluo.txt

#在cluo.txt查找cluo所在行,并在其上一行添加word字符,i表示在其上一行添加字符串
sed '/cluo/iword' cluo.txt

#在cluo.txt查找以test结尾的行尾添加字符串word,$表示结尾标识,&在Sed中表示添加
sed 's/test$/&word/g' cluo.txt

#在cluo.txt查找www的行,在其行首添加字符串word,^表示起始标识,&在Sed中表示添加
sed '/www/s/^/&word/' cluo.txt

#多个sed命令组合,使用-e参数
sed -e  '/www.jd.com/s/^/&1./'  -e  's/www.jd.com$/&./g'  cluo.txt

#多个sed命令组合,使用分号“;”分割
sed  -e  '/www.jd.com/s/^/&1./;s/www.jd.com$/&./g'  cluo.txt

#Sed读取系统变量,变量替换
WEBSITE=www.baidu.com
sed  “s/www.jd.com/$WEBSITE/g” cluo.txt

#修改Selinux策略enforcing为disabled,查找/SELINUX/行,然后将其行enforcing值改成disabled、!s表示不包括SELINUX行
sed  -i   '/SELINUX/s/enforcing/disabled/g' /etc/selinux/config
sed  -i   '/SELINUX/!s/enforcing/disabled/g' /etc/selinux/config

#两行合并,合并上下两行
sed 'N;s/\n//' cluo.txt

4.3 AWK

AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一,以Aho、Weinberger、Kernighan三位发明者名字首字母命名为AWK,AWK是一个行级文本高效处理工具,AWK经过改进生成的新的版本有Nawk、Gawk,一般Linux默认为Gawk,Gawk是 AWK的GNU开源免费版本。
AWK基本原理是逐行处理文件中的数据,查找与命令行中所给定内容相匹配的模式,如果发现匹配内容,则进行下一个编程步骤,如果找不到匹配内容,则继续处理下一行。其语法参数格式为:

awk -option ‘pattern + {action}’ file

AWK基本语法参数详解:
单引号’ '是为了和shell命令区分开;
大括号{ }表示一个命令分组;
pattern是一个过滤器,表示匹配pattern条件的行才进行Action处理;
action是处理动作,常见动作为Print;
使用#作为注释,pattern和action可以只有其一,但不能两者都没有。

AWK内置变量详解:
FS 分隔符,默认是空格;
OFS 输出分隔符;
NR 当前行数,从1开始;
NF 当前记录字段个数;
$0 当前记录;
1 1~n 当前记录第n个字段(列)。

AWK内置函数详解:
gsub(r,s):在$0中用s代替r;
index(s,t):返回s中t的第一个位置;
length(s):s的长度;
match(s,r):s是否匹配r;
split(s,a,fs):在fs上将s分成序列a;
substr(s,p):返回s从p开始的子串。

AWK常用操作符,运算符及判断符:
*++ – 增加与减少( 前置或后置);
^ ** 指数( 右结合性);
! + - 非、一元(unary) 加号、一元减号;
+ - * / % 加、减、乘、除、余数;
< <= == != > >= 数字比较;
&& 逻辑and;
|| 逻辑or;
= += -= *= /= %= ^= 赋值。

AWK与流程控制语句:
if(condition) { } else { };
while { };
do{ }while(condition);
for(init;condition;step){ };
break/continue。

实例:

#AWK打印硬盘设备名称,默认以空格为分割
df -h|awk  '{print  $1}'

#AWK以空格、冒号、\t、分号为分割
awk -F '[:\t;]' '{print $1}' cluo.txt

#AWK以冒号分割,打印第一列,同时将内容追加到/tmp/awk.log下
awk -F: '{print $1 >> "/tmp/awk.log"}' cluo.txt

#打印文件中的第3行至第5行,NR表示打印行,$0表示文本所有域
awk 'NR==3,NR==5 {print}' cluo.txt
awk 'NR==3,NR==5 {print $0}' cluo.txt

#打印文件中的第3行至第5行的第一列与最后一列
awk 'NR==3,NR==5 {print $1,$NF}' cluo.txt

#打印文件中,长度大于80的行号
awk 'length($0)>80 {print NR}' cluo.txt

#AWK引用Shell变量,使用-v或者双引号+单引号即可
awk -v STR=hello '{print STR,$NF}' cluo.txt
STR="hello";echo|awk '{print "'${STR}'";}'

#AWK以冒号切割,打印第一列同时只显示前5行
cat /etc/passwd|head -5|awk -F: '{print $1}'
awk -F: 'NR>=1&&NR<=5 {print $1}' /etc/passwd

#awk指定文件jfedu.txt第一列的总和
cat cluo.txt |awk '{sum+=$1}END{print sum}'

#NR行号除以2余数为0则跳过该行,继续执行下一行,打印在屏幕
awk -F: 'NR%2==0{next}{print NR,$1}' /etc/passwd

#添加自定义字符
ifconfig  eth0|grep "Bcast"|awk '{print "ip_"$2}'

#AWK与if组合实战,进行数字比较
echo 3 2 1 |awk '{if(($1>$2)||($1>$3)) {print $2} else {print $1}}'

#分析Nginx访问日志的状态码404、502等错误信息页面,统计次数大于20的IP地址
awk '{if ($9~/502|499|500|503|404/) print $1,$9}' access.log|sort|uniq –c|sort –nr | awk '{if($1>20) print $2}'

#统计服务器状态连接数
netstat -an | awk '/tcp/ {print $NF}' | sort | uniq -c

4.4 GREP

全面搜索正则表达式(Global search regular expression(RE) ,GREP)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
Unix/Linux的grep家族包括grep、egrep和fgrep,其中egrep和fgrep的命令跟grep有细微的区别,egrep是grep的扩展,支持更多的re元字符, fgrep是fixed grep或fast grep简写,它们把所有的字母都看作单词,正则表达式中的元字符表示其自身的字面意义,不再有其他特殊的含义,一般使用比较少。
目前Linux操作系统默认使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。其语法格式如下:

grep -opiton ‘word’ Filename

参数详解:

-a 						以文本文件方式搜索;
-c 						计算找到的符合行的次数;
-i 						忽略大小写;
-n 						顺便输出行号;
-v 						反向选择,即显示不包含匹配文本的所有行;
-h 						查询多文件时不显示文件名;
-l 						查询多文件时只输出包含匹配字符的文件名;
-s 						不显示不存在或无匹配文本的错误信息;
-E 						允许使用egrep扩展模式匹配。

通配符类型详解:

*						0个或者多个字符、数字;
?						匹配任意一个字符;
#						表示注解;
|						管道符号;
;						多个命令连续执行;
&						后台运行指令;
!						逻辑运算非;
[ ]						内容范围,匹配括号中内容;
{ }						命令块,多个命令匹配。

正则表达式详解:

*						前一个字符匹配0次或多次;
.						匹配除了换行符以外任意一个字符;
.*						代表任意字符(1个多个+);
^						匹配行首,即以某个字符开头;
$						匹配行尾,即以某个字符结尾;
\(..\) 					标记匹配字符;
[]						匹配中括号里的任意指定字符,但只匹配一个字符;
[^]						匹配除中括号以外的任意一个字符;
\						转义符,取消特殊含义;
\< 						锚定单词的开始;
\> 						锚定单词的结束;
{n}						匹配字符出现n次;
{n,}					    匹配字符出现大于等于n次;
{n,m}					匹配字符至少出现n次,最多出现m次;
\w 						匹配文字和数字字符,不匹配符号;
\W 						\w的反置形式,匹配一个或多个非单词字符,匹配符号;
\b 						单词锁定符;
\s						匹配任何空白字符;
\d						匹配一个数字字符,等价于[0-9]。

实例:

grep  -c "test" cluo.txt	 统计test字符总行数;
grep  -i "TEST" cluo.txt	 不区分大小写查找TEST所有的行;
grep  -n "test" cluo.txt	 打印test的行及行号;
grep  -v "test" cluo.txt	 不打印test的行;
grep  "test[53]" cluo.txt	 以字符test开头,接5或者3的行;
grep  "^[^test]" cluo.txt	 显示输出行首不是test的行;
grep  "[Mm]ay" cluo.txt	 匹配M或m开头的行;
grep  "K…D" cluo.txt	 匹配K,三个任意字符,紧接D的行;
grep  "[A-Z][9]D" cluo.txt	 匹配大写字母,紧跟9D的字符行;
grep  "T\{2,\}" cluo.txt	 打印字符T字符连续出现2次以上的行;
grep  "T\{4,6\}" cluo.txt	 打印字符T字符连续出现4次及6次的行;
grep  -n "^$" cluo.txt	 打印空行的所在的行号;
grep  -vE "#|^$" cluo.txt    不匹配文件中的#和空行;
grep   --color -ra -E  "db|config|sql"  *  匹配包含db或者config或者sql的文件;
grep   --color -E "\<([0-9]{1,3}\.){3}([0-9]{1,3})\>"  cluo.txt 匹配IPV4地址

5、数组

数组是相同数据类型的元素按一定顺序排列的集合,把有限个类型相同的变量用一个名字命名,然后用编号区分他们变量的集合,这个名称称之为数组名,编号称为下标。Linux Shell编程中常用一维数组。
定义数组一般以小括号的方式来定义,数组的值可以随机指定,如下为一维数组的定义、统计、引用和删除操作:

(1) 一唯数组定义及创建:

ARRTEST=( 
test1
test2
test3 
)
LAMP=(httpd  php  php-devel php-mysql mysql mysql-server)

(2) 数组下标一般从0开始,如下为引用数组的方法:

echo	${ARRTEST[0]}    	    引用第一个数组变量,结果打印test1;
echo 	${ARRTEST[1]}		    引用第二个数组变量;
echo  	${ARRTEST[@]}   		显示该数组所有参数;
echo  	${#ARRTEST[@]}  		显示该数组参数个数;
echo    ${#ARRTEST[0]}       显示test1字符长度;
echo    ${ARRTEST[@]:0}   	打印数组所有的值;
echo    ${ARRTEST[@]:1}   	打印从第二个值开始的所有值;
echo    ${ARRTEST[@]:0:2} 	打印从第一个值与第二个值;
echo    ${ARRTEST[@]:1:2} 	打印从第二个值与第三个值。

(3) 数组替换操作:

ARRTEST=( [0]=www1 [1]=www2 [2]=www3 )	      数组赋值;

echo  ${ARRTEST[@]/www1/www0}				      将数组值www1替换为www0;
NEWARRTEST=`echo  ${ARRTEST[@]/www1/www0}`      将结果赋值新数组。

(4) 数组删除操作:

unset array[0]   	            删除数组第一个值;
unset array[1]             	删除数组第二个值;
unset array                   删除整个数组。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!