您的位置:首页 > 大数据 > 云计算

《云计算》shell脚本的基础应用(4)

2019-06-05 22:39 1036 查看

1.字符串截取及切割
问题
使用Shell完成各种Linux运维任务时,一旦涉及到判断、条件测试等相关操作时,往往需要对相关的命令输出进行过滤,提取出符合要求的字符串。
本案例要求熟悉字符串的常见处理操作,完成以下任务练习:
参考PPT示范操作,完成子串截取、替换等操作
根据课上的批量改名脚本,编写改进版renfilex.sh:能够批量修改当前目录下所有文件的扩展名,修改前/后的扩展名通过位置参数$1、$2提供
方案
子串截取的三种用法:
var:起始位置:长度exprsubstr"{var:起始位置:长度} expr substr "var:起始位置:长度exprsubstr"var" 起始位置 长度
echo var∣cut−b起始位置−结束位置路径分割:取目录位置:dirname"字符串"取文档的基本名称:basename"字符串"子串替换的两种用法:只替换第一个匹配结果:var | cut -b 起始位置-结束位置 路径分割: 取目录位置:dirname "字符串" 取文档的基本名称:basename "字符串" 子串替换的两种用法: 只替换第一个匹配结果:var∣cut−b起始位置−结束位置路径分割:取目录位置:dirname"字符串"取文档的基本名称:basename"字符串"子串替换的两种用法:只替换第一个匹配结果:{var/old/new}
替换全部匹配结果:var//old/new字符串掐头去尾:从左向右,最短匹配删除:{var//old/new} 字符串掐头去尾: 从左向右,最短匹配删除:var//old/new字符串掐头去尾:从左向右,最短匹配删除:{变量名#关键词}
从左向右,最长匹配删除:KaTeX parse error: Expected '}', got '#' at position 5: {变量名#̲#*关键词} 从右向左,最短匹…{变量名%关键词}
从右向左,最长匹配删除:${变量名%%关键词*}
步骤
实现此案例需要按照如下步骤进行。
步骤一:字符串的截取
1)方法一,使用 表达式格式:{}表达式 格式:表达式格式:{var:起始位置:长度}
定义一个变量SCHOOL,并确认其字符串长度:
[root@svr5 ~]# SCHOOL=“Tarena IT Group.”
[root@svr5 ~]# echo KaTeX parse error: Expected '}', got '#' at position 2: {#̲SCHOOL} 16 …{}截取时,起始位置可以省略,省略时从第一个字符开始截。比如,以下操作都可以从左侧开始截取前6个字符:
[root@svr5 ~]# echo ${SCHOOL::6}
Tarena
或者
[root@svr5 ~]# echo SCHOOL:0:6Tarena使用{SCHOOL:0:6} Tarena 使用SCHOOL:0:6Tarena使用{}方式截取字符串时,起始位置是从0开始的(和数组下标编号类似) 。
因此,如果从起始位置1开始截取6个字符,那就变成这个样子了:
[root@svr5 ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 117: …: [root@svr5 ~]#̲ md5sum /etc/fs…(md5sum /etc/fstab) //保存到变量
[root@svr5 ~]# echo MD5STR::32//截取前32个字符(MD5值的固定长度)eef0254e6049a411dc30db864c0ee6ea2)方法二,使用exprsubstr格式:exprsubstr"{MD5STR::32} //截取前32个字符(MD5值的固定长度) eef0254e6049a411dc30db864c0ee6ea 2)方法二,使用 expr substr 格式:expr substr "MD5STR::32//截取前32个字符(MD5值的固定长度)eef0254e6049a411dc30db864c0ee6ea2)方法二,使用exprsubstr格式:exprsubstr"var" 起始位置 长度
还以前面的SCHOOL变量为例,确认原始值:
[root@svr5 ~]# echo $SCHOOL
Tarena IT Group.
[root@svr5 ~]# echo KaTeX parse error: Expected '}', got '#' at position 2: {#̲SCHOOL} 16 使用ex…{}相区分。
从左侧截取SCHOOL变量的前6个字符:
[root@svr5 ~]# expr substr “$SCHOOL” 1 6
Tarena
这里注意,因为SCHOOL变量的值里含有空格,所以应该加双引号进行调用,否则是会报错的:
[root@svr5 ~]# expr substr KaTeX parse error: Expected 'EOF', got '#' at position 61: …: [root@svr5 ~]#̲ expr substr "SCHOOL" 11 16
Group.
应用示例:还是提取文件/etc/fstab的MD5SUM校验和字串,排除无关文本。若采用expr substr,则相关操作及结果如下所示:
[root@svr5 ~]# md5sum /etc/fstab //确认MD5SUM校验值
eef0254e6049a411dc30db864c0ee6ea /etc/fstab
[root@svr5 ~]# MD5STR=KaTeX parse error: Expected 'EOF', got '#' at position 44: …量 [root@svr5 ~]#̲ expr substr "MD5STR" 1 32 //截取前32个字符
eef0254e6049a411dc30db864c0ee6ea
3)方式三,使用cut分割工具
格式:echo $var | cut -b 起始位置-结束位置
选项 -b 表示按字节截取字符,其中起始位置、结束位置都可以省略。当省略起始位置时,视为从第1个字符开始(编号也是从1开始,与expr类似),当省略结束位置时,视为截取到最后。
还以前面的SCHOOL变量为例,确认原始值:
[root@svr5 ~]# echo $SCHOOL
Tarena IT Group.
[root@svr5 ~]# echo ${#SCHOOL}
16
从左侧截取前6个字符,可执行以下操作:
[root@svr5 ~]# echo $SCHOOL | cut -b 1-6
Tarena
或者
[root@svr5 ~]# echo $SCHOOL | cut -b -6
Tarena
截取第11-16个字符:
[root@svr5 ~]# echo $SCHOOL | cut -b 11-16
Group.
从第8个字符截取到末尾:
[root@svr5 ~]# echo $SCHOOL | cut -b 8-
IT Group.
只截取单个字符,比如第9个字符:
[root@svr5 ~]# echo $SCHOOL | cut -b 9
T
如果起始位置、结束位置同时省略,那就和直接echo变量值没啥区别了:
[root@svr5 ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 123: …: [root@svr5 ~]#̲ md5sum /etc/fs…{var/old/new}
以前面的SCHOOL变量作为测试,先确认变量值:
[root@svr5 ~]# echo $SCHOOL
Tarena IT Group.
将字符串中的第1个r替换为RRRR:
[root@svr5 ~]# echo SCHOOL/r/RRRRTaRRRRenaI 20000 TGroup.2)替换全部子串格式:{SCHOOL/r/RRRR} TaRRRRena IT Group. 2)替换全部子串 格式:SCHOOL/r/RRRRTaRRRRenaITGroup.2)替换全部子串格式:{var//old/new}
以前面的SCHOOL变量作为测试,先确认变量值:
[root@svr5 ~]# echo $SCHOOL
Tarena IT Group.
将字符串中的所有r都替换为RRRR:
[root@svr5 ~]# echo ${SCHOOL//r/RRRR}
TaRRRRena IT GRRRRoup.
3)应用示例,根据变量值重设主机名
用法分解,将当前主机名的域后缀替换为“localdomain”:
[root@svr5 ~]# echo $HOSTNAME //确认当前的主机名
svr5.tarena.com
[root@svr5 ~]# echo ${HOSTNAME/tarena.com/localdomain}
svr5.localdomain //替换后的字串
将当前主机名整个替换为“localhost.localdomain”:
[root@svr5 ~]# echo KaTeX parse error: Expected '}', got 'EOF' at end of input: {HOSTNAME/HOSTNAME/localhost.localdomain}
localhost.localdomain
假设要设置的新主机名保存在变量MYFQDN内,则重设操作如下所示:
[root@svr5 ~]# MYFQDN=“dbsvr.example.org” //新主机名变量
[root@svr5 ~]# hostname KaTeX parse error: Expected '}', got 'EOF' at end of input: {HOSTNAME/HOSTNAME/$MYFQDN} //重设操作
[root@svr5 ~]# hostname //确认修改后的主机名
dbsvr.example.org
如果希望恢复为原来的主机名,只要修改变量MYFQDN的值,然后再重新执行一遍替换操作即可:
[root@svr5 ~]# MYFQDN=“svr5.tarena.com” //定义要恢复的主机名
[root@svr5 ~]# hostname KaTeX parse error: Expected '}', got 'EOF' at end of input: {HOSTNAME/HOSTNAME/$MYFQDN} //重设主机名
[root@svr5 ~]# hostname //确认恢复结果
svr5.tarena.com
引入变量来保存主机名以后,可以使Shell脚本具有更广泛的适用性。
步骤三:字符串的匹配删除
以处理系统默认的邮箱路径为例,可直接使用环境变量MAIL:
[root@svr5 ~]# echo MAIL/var/spool/mail/root1)从左向右,最短匹配删除格式:MAIL /var/spool/mail/root 1)从左向右,最短匹配删除 格式:MAIL/var/spool/mail/root1)从左向右,最短匹配删除格式:{变量名#关键词}
删除从左侧第1个字符到最近的关键词“oo”的部分, 作通配符理解:
[root@svr5 ~]# echo ${MAIL#oo}
l/mail/root
删除从左侧第1个字符到最近的关键词“/”的部分:
[root@svr5 ~]# echo KaTeX parse error: Expected '}', got '#' at position 6: {MAIL#̲*/} var/spool/m…{变量名##关键词}
删除从左侧第1个字符到最远的关键词“oo”的部分:
[root@svr5 ~]# echo $MAIL //确认变量MAIL的值
/var/spool/mail/root
[root@svr5 ~]# echo ${MAIL##oo}
t
删除从左侧第1个字符到最远的关键词“/”的部分:
[root@svr5 ~]# echo ${MAIL##/}
root
操作 ${MAIL##/} 的效果与使用basename命令提取基本名称的效果相同:
[root@svr5 ~]# basename MAILroot3)从右向左,最短匹配删除格式:MAIL root 3)从右向左,最短匹配删除 格式:MAILroot3)从右向左,最短匹配删除格式:{变量名%关键词}
删除从右侧最后1个字符到往左最近的关键词“oo”的部分,* 做通配符理解:
[root@svr5 ~]# echo $MAIL //确认变量MAIL的值
[root@svr5 ~]# echo ${MAIL%oo*}
/var/spool/mail/r
删除从右侧最后1个字符到往左最近的关键词“/”的部分:
[root@svr5 ~]# echo ${MAIL%/}
/var/spool/mail
操作 ${MAIL%/} 的效果与使用dirname命令提取目录名称的效果相同:
[root@svr5 ~]# dirname MAIL/var/spool/mail4)从右向左,最长匹配删除格式:MAIL /var/spool/mail 4)从右向左,最长匹配删除 格式:MAIL/var/spool/mail4)从右向左,最长匹配删除格式:{变量名%%关键词*}
删除从右侧最后1个字符到往左最远的关键词“oo”的部分:
[root@svr5 ~]# echo $MAIL //确认变量MAIL的值
/var/spool/mail/root
root@svr5 ~]# echo ${MAIL%%oo*}
/var/sp
删除从右侧最后1个字符到往左最远的关键词“/”的部分(删没了):
[root@svr5 ~]# echo ${MAIL%%/*}

[root@svr5 ~]#
步骤四:编写renfilex.sh脚本
1)验证原始改名脚本renfile.sh的效果
脚本用途为:批量修改当前目录下的文件扩展名,将.doc改为.txt。
脚本内容参考如下:
[root@svr5 ~]# vim renfile.sh
#!/bin/bash
for FILE in *.doc
do
mv $FILE ${FILE%.doc}.txt
done
[root@svr5 ~]# chmod +x renfile.sh
创建一个测试用的文件夹rendir,并在其下建几个测试文件
[root@svr5 ~]# mkdir rendir
[root@svr5 ~]# cd rendir
[root@svr5 rendir]# touch file1.doc abcde.doc xxyyzz.doc other1.xls killbill.mp4
[root@svr5 rendir]# ls
abcde.doc file1.doc killbill.mp4 other1.xls xxyyzz.doc
调用renfile.sh脚本,查看修改结果(原来扩展名为.doc的文件,其扩展名都变成了.txt):
[root@svr5 rendir]# …/renfile.sh
[root@svr5 rendir]# ls
abcde.txt file1.txt killbill.mp4 other1.xls xxyyzz.txt
2)建立改进版脚本renfilex.sh
要适应不同扩展名文件的修改,并能够反向还原。
修改前的扩展名、修改后的扩展名通过位置变量 $1、$2提供。
改进的脚本编写参考如下:
[root@svr5 rendir]# cp …/renfile.sh …/renfilex.sh
[root@svr5 rendir]# vim …/renfilex.sh
#!/bin/bash
for FILE in “$1”
do
mv $FILE ${FILE%$1}"KaTeX parse error: Expected 'EOF', got '#' at position 62: …ot@svr5 rendir]#̲ ls //修…{var:-word}
若变量var已存在且非Null,则返回 $var 的值;否则返回字串“word”,原变量var的值不受影响。
变量值已存在的情况:
[root@svr5 ~]# echo $SCHOOL //查看原变量值
Tarena IT Group.
[root@svr5 ~]# echo ${SCHOOL:-Tarena} //因SCHOOL已存在,输出变量SCHOOL的值
Tarena IT Group.
[root@svr5 ~]# echo $SCHOOL //原变量的值并不改变
Tarena IT Group.
变量值不存在的情况:
[root@svr5 ~]# unset SCHOOL //清除SCHOOL变量
[root@svr5 ~]# echo ${SCHOOL:-Tarena} //因SCHOOL已不存在,输出“Tarena”
Tarena
[root@svr5 ~]# echo $SCHOOL //变量SCHOOL仍然不存在

[root@svr5 ~]#
2)取值+赋值,${var:=word}
若变量var已存在且非Null,则返回 $var 的值,原变量值不变;否则返回字串“word”,并将此字串赋值给变量 var。
变量值不存在的情况:
[root@svr5 ~]# echo $SCHOOL //前面已将此变量清除

[root@svr5 ~]# echo ${SCHOOL:=Tarena} //因SCHOOL不存在,输出“Tarena”
Tarena
[root@svr5 ~]# echo $SCHOOL //且将“Tarena”赋值给变量SCHOOL
Tarena
变量值已存在的情况:
[root@svr5 ~]# echo $SCHOOL //确认当前的变量值
Tarena
[root@svr5 ~]# echo ${SCHOOL:=Tarena IT Group.} //变量已存在,输出其值
Tarena
[root@svr5 ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 140: …下 [root@svr5 ~]#̲ vim sumx.sh #!…{x:-1}
i=1; SUM=0
while [ $i -le x]doletSUM+=ileti++doneecho"从1到x ] do let SUM+=i let i++ done echo "从1到x]doletSUM+=ileti++doneecho"从1到x的总和是:$SUM"

[root@svr5 ~]# chmod +x sumx.sh
2)验证、测试脚本执行效果:
[root@svr5 ~]# ./sumx.sh
请输入一个正整数:25 //输入25,正常读入并计算、输出结果
从1到25的总和是:325
[root@svr5 ~]# ./sumx.sh
请输入一个正整数:70 //输入70,正常读入并计算、输出结果
从1到70的总和是:2485
[root@svr5 ~]# ./sumx.sh
请输入一个正整数: //直接回车,设x=1后计算、输出结果
从1到1的总和是:1
3.使用Shell数组
问题
本案例要求编写一个Shell脚本getips.sh,相关要求如下:
能够反复从键盘输入IP地址,保存到数组
当用户输入“EOF”后结束输入,显示数组IPADDS各元素的值
最后报告本次录入的IP地址个数、其中第1个录入的地址
方案
建立数组的方法:
格式1,整体赋值:数组名=(值1 值2 … … 值n)
格式2,单个元素赋值:数组名[下标]=值
查看数组元素的方法:
获取单个数组元素:数组名[下标]获取所有数组元素:{数组名[下标]} 获取所有数组元素:数组名[下标]获取所有数组元素:{数组名[@]}
获取数组元素个数:KaTeX parse error: Expected '}', got '#' at position 2: {#̲数组名[@]} 获取连续的多个…{数组名[@]:起始下标:元素个数}
获取某个数组元素的长度:KaTeX parse error: Expected '}', got '#' at position 2: {#̲数组名[下标]} 截取数组元素…{#数组名[下标]:起始下标:字符数}
步骤
实现此案例需要按照如下步骤进行。
步骤一:认识数组的赋值/引用基本方法
1)declare命令的使用
在Shell环境中,变量默认均作为字符串处理,当参与expr、[]数学运算时自动作为整数处理。比如,使用“1+2”、“X+2”、“[]数学运算时自动作为整数处理。比如,使用“1+2”、“X+2”、“[]数学运算时自动作为整数处理。比如,使用“1+2”、“X+2”、“X+2”表达式是无法将运算结果直接作为整数赋值给指定的变量的:
[root@svr5 ~]# X=24
[root@svr5 ~]# A=1+2
[root@svr5 ~]# echo $A
1+2 //赋值结果为字符串
[root@svr5 ~]# A=X+2
[root@svr5 ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 40: …串 [root@svr5 ~]#̲ A=X+2
[root@svr5 ~]# echo $A
24+2 //赋值结果为字符串
上述操作中,变量A均作为字符串处理。
若要将一个变量强制设置为整数,可以使用declare命令声明(-i选项):
[root@svr5 ~]# declare -i A //先将A声明为整数变量
[root@svr5 ~]# A=1+2 //然后赋值
[root@svr5 ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 30: …3 [root@svr5 ~]#̲ declare -i B=X+2 //也可以在声明的同时进行赋值
[root@svr5 ~]# echo $B
26
declare命令结合-x选项,可以将局部变量设置为全局变量,这个与export命令的作用差不多:
[root@svr5 ~]# declare -x NM=“Tarena” //新建全局变量NM
[root@svr5 ~]# bash //进入子Shell环境
[root@svr5 ~]# echo $NM //验证全局变量
Tarena
[root@svr5 ~]# exit //返回到原Shell环境
exit
[root@svr5 ~]#
如果要取消变量的全局属性,可以使用“+x”选项:
[root@svr5 ~]# declare +x NM //将NM恢复为局部变量
[root@svr5 ~]# bash //进入子Shell环境
[root@svr5 ~]# echo $NM //检查已无法调用NM变量

[root@svr5 ~]# exit //返回到原Shell环境
exit
[root@svr5 ~]#
declare命令结合-r选项,可以为变量设置“只读”属性,只读变量的值不允许再被修改,通常可用来保存一些固定的参数,避免无意中被修改:
[root@svr5 ~]# echo $NM
Tarena
[root@svr5 ~]# declare -r NM //将变量NM设置为只读
[root@svr5 ~]# NM=“Tarena IT Group.” //重新赋值失败
-bash: NM: readonly variable
[root@svr5 ~]# echo $NM //查看还是原来的值
Tarena
只读变量除了不能修改值以外,也无法被unset清除(若要清除只读变量,需要退出当前Shell程序):
[root@svr5 ~]# unset NM
-bash: unset: NM: cannot unset: readonly variable
[root@svr5 ~]# echo $NM
Tarena
2)定义/赋值数组
使用declare命令,结合-a选项可声明一个数组(这个操作一般可不做),比如:
[root@svr5 ~]# declare -a SVRS
直接执行declare -a,即不指定数组名参数时,会列出当前Shell环境中已定义的所有数组设置:
[root@svr5 ~]# declare -a //查看已定义的数组
declare -a BASH_ARGC=’()’
declare -a BASH_ARGV=’()’
declare -a BASH_LINENO=’()’
declare -a BASH_SOURCE=’()’
declare -ar BASH_VERSINFO=’([0]=“3” [1]=“2” [2]=“25” [3]=“1” [4]=“release” [5]=“x86_64-redhat-linux-gnu”)’
declare -a DIRSTACK=’()’
declare -a FQDNS=’([0]=“www.tarena.com” [1]=“mail.tarena.com” [2]=“club.tarena.com”)’
declare -a FUNCNAME=’()’
declare -a GROUPS=’()’
declare -a PIPESTATUS=’([0]=“0” [1]=“0”)’
declare -a SVRS=’([0]=“www” [1]=“ftp” [2]=“mail” [3]=“club”)’
若要定义数组的成员,可以在declare声明时定义,也可以直接整体定义。整体赋值的格式为“数组名=(值1 值2 值3 … …)”,比如:
[root@svr5 ~]# MY_SVRS=(www ftp mail club)
[root@svr5 ~]# set | grep “MY_” //查看数组定义结果
MY_SVRS=([0]=“www” [1]=“ftp” [2]=“mail” [3]=“club”)
Shell中的语法要求是比较松散的,所以我们也可以直接为单个数组元素赋值,格式为“数组名[下标]=值”,每个数组元素的编号(即下标)从0开始。比如,以下操作会产生一个包括3个元素的数组:
[root@svr5 ~]# WEB_SVRS[0]=“www.tarena.com” //为第1个元素赋值
[root@svr5 ~]# WEB_SVRS[1]=“mail.tarena.com” //为第2个元素赋值
[root@svr5 ~]# WEB_SVRS[2]=“club.tarena.com” //为第3个元素赋值
[root@svr5 ~]# set | grep “WEB_” //查看数组定义
WEB_SVRS=([0]=“www.tarena.com” [1]=“mail.tarena.com
[2]=“club.tarena.com”)
为数组元素赋值时,并不要求每个成员都需要指定,下标也可以不连续。比如,可跳过下标3,直接为下标为4的元素赋值:
[root@svr5 ~]# WEB_SVRS[4]=“tts6.tarena.com
[root@svr5 ~]# set | grep “WEB_” //确认设置结果
WEB_SVRS=([0]=“www.tarena.com” [1]=“mail.tarena.com” [2]=“club.tarena.com” [4]=“tts6.tarena.com”)
3)查看数组、查看数组元素
输出整个数组的内容:
[root@svr5 ~]# echo ${MY_SVRS[@]}
www ftp mail club
查看第1个(下标为0的)数组元素:
[root@svr5 ~]# echo ${MY_SVRS[0]}
www
或者
[root@svr5 ~]# echo ${MY_SVRS} //省略下标时,默认视为0
www
输出下标为2的数组元素:
[root@svr5 ~]# echo ${MY_SVRS[2]}
mail
输出数组中下标从1开始的2个元素:
[root@svr5 ~]# echo ${MY_SVRS[@]:1:2}
ftp mail
查看数组的元素个数:
[root@svr5 ~]# echo ${#MY_SVRS[@]}
4
[root@svr5 ~]# echo KaTeX parse error: Expected '}', got '#' at position 2: {#̲WEB_SVRS[@]} 4 …IP" != “EOF” ]
do
IPADDS[i]="i]="i]="IP" //每次录入赋值给不同的数组元素
let i++
done
echo “您已录入的IP地址如下:”
echo ${IPADDS[@]} //输出整个数组
echo “总共包括 KaTeX parse error: Expected '}', got '#' at position 2: {#̲IPADDS[@]} 个地址,…{IPADDS[0]}” //输出第1个元素
[root@svr5 ~]# chmod +x getips.sh
3)验证、测试脚本
[root@svr5 ~]# ./getips.sh
请添加IP地址(输EOF结束):192.168.4.77
请添加IP地址(输EOF结束):172.16.16.220
请添加IP地址(输EOF结束):218.56.57.58
请添加IP地址(输EOF结束):192.168.1.5
请添加IP地址(输EOF结束):192.168.1.202
请添加IP地址(输EOF结束):220.106.0.20
请添加IP地址(输EOF结束):EOF
您已录入的IP地址如下:
192.168.4.77 172.16.16.220 218.56.57.58 192.168.1.5 192.168.1.202 220.106.0.20
总共包括 6 个地址,
其中第1个IP地址是:192.168.4.77
4)遍历数组元素时分行显示
当数组元素的内容较多时,直接输出 KaTeX parse error: Expected 'EOF', got '#' at position 131: …: [root@svr5 ~]#̲ vim getips.sh …IP" != “EOF” ]
do
IPADDS[i]="i]="i]="IP"
let i++
done
echo “您已录入的IP地址如下:”
#echo ${IPADDS[@]}
i=0 //控制下标增长的变量
while [ $i -lt ${#IPADDS[@]} ] //条件为下标小于元素个数
do
echo KaTeX parse error: Expected '}', got 'EOF' at end of input: {IPADDS[@]:i:4} //输出连续的四个元素
let i+=4 //下标自增4
done
echo “总共包括 KaTeX parse error: Expected '}', got '#' at position 2: {#̲IPADDS[@]} 个地址,…{IPADDS[0]}”
验证脚本执行效果:
[root@svr5 ~]# ./getips.sh
请添加IP地址(输EOF结束):192.168.4.77
请添加IP地址(输EOF结束):172.16.16.220
请添加IP地址(输EOF结束):192.168.1.5
请添加IP地址(输EOF结束):192.168.1.202
请添加IP地址(输EOF结束):10.0.0.17
请添加IP地址(输EOF结束):10.0.0.27
请添加IP地址(输EOF结束):220.106.0.20
请添加IP地址(输EOF结束):202.110.79.81
请添加IP地址(输EOF结束):61.133.84.128
请添加IP地址(输EOF结束):61.133.84.72
请添加IP地址(输EOF结束):EOF
您已录入的IP地址如下:
192.168.4.77 172.16.16.220 192.168.1.5 192.168.1.202
10.0.0.17 10.0.0.27 220.106.0.20 202.110.79.81
61.133.84.128 61.133.84.72
总共包括 10 个地址,
其中第1个IP地址是:192.168.4.77

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: