shell-第二章 定义变量

第二章 Shell变量定义 1. Shell变量概述 2. Shell变量赋值 3. Shell变量替换 4. Shell变量运算 5. Shell变量案例

  1. Shell变量概述
  2. 什么是变量

变量是Shell传递数据的一种方法,简单理解:用一个固定的字符串去表示不固定的内容,便于后续引用。

2.变量命令规范

变量定义时名称有要求:字母、数字、下划线几个组成,尽量字母开头,变量名最好具备一定的含义。

ip=10.0.0.100

ip1=10.0.0.100

Hostname_Ip=10.0.0.100

hostname_IP=10.0.0.100

等号是赋值,需要注意:等号两边不能有空格,其次定义的变量不要与系统命令出现冲突。

  1. Shell变量定义的方式

01)用户自定义变量:人为定义的变量名称。

02)系统环境变量:保存的是和系统操作环境相关的数据。

03)位置参数变量:向脚本中进行参数传递,变量名不能自定义,变量作用是固定的。

04)预定义的变量:是bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

  1. Shell变量定义实践

01.用户自定义变量示例,当前Shell有效

#1.定义变量,变量名=变量值。不能出现"-横岗"命令 [root@qiudao ~]# qiudao="hello shell" #定义变量有空格时,必须使用引号

#2.引用变量,$变量名 或 ${变量名} [root@rlb ~]# echo $rlb hello shell [root@qiudao ~]# echo $rlb_test

[root@qiudao ~]# echo $_test hello shell_test

#3.查看变量,set显示所有变量,包括自定义变量和环境变量 [root@rlb ]# set |grep rlb HOSTNAME=rlb rlb='hello shell' [root@rlb]# env|grep rlb #只显示系统的环境变量 HOSTNAME=rlb

#4.取消变量,作用范围:仅在当前Shell中有效。 [root@rlb ~]# unset rlb [root@rlb ~]# set |grep qiudao HOSTNAME=rlb

#5.注意事项,引用变量时注意事项,单双引号和不加引号的区别。 [root@rlb ~]# var=$(hostname) [root@rlb ~]# echo $var qiudao [root@rlb ~]# var="$(hostname)" [root@rlb ~]# echo $var rlb [root@rlb ~]# var='$(hostname)' [root@rlb ~]# echo $var $(hostname) [root@rlb ~]# echo "$var" $(hostname) [root@rlb ~]# echo '$var' $var [root@rlb ~]# name=qiudao [root@rlb ~]# echo $name qiudao [root@rlb ~]# echo $name money is $10000000000 rlb money is 0000000000 [root@rlb ~]# echo "$name money is $10000000000" rlb money is 0000000000 [root@rlb ~]# echo '$name money is $10000000000' $name money is $10000000000 [root@rlb ~]# echo $name money is $10000000000 rlb money is $10000000000 [root@rlb ~]# echo "$name money is $10000000000" qiudao money is $10000000000 [root@rlb ~]# echo '$name money is $10000000000' $name money is $10000000000 [root@rlb ~]# echo $name money is '$10000000000' rlb money is $10000000000

总结: 单引号 #所见即所得,吃啥吐啥,原封不动的输出。 双引号 #与单引号类似,特殊符号会被解析(运行):$ $() `` 不加引号 #与双引号类似,如果出现空格,不会算作一个整体。 反引号 #先执行反引号里面的命令,把执行的结果显示出来。

  1. 系统环境变量示例,在当前Shell和子Shell有效

#1.定义环境变量:export 变量,将自定义变量转换成环境变量。 [root@rlb ~]# echo $name rlb [root@rlb ~]# cat test.sh #!bin/bash echo $name [root@rlb ~]# sh test.sh #执行脚本时,会调用另一个bash执行,就访问不到$name的值。

[root@rlb ~]# [root@rlb ~]# export name=qiudao #将变量转换为环境变量 [root@rlb ~]# sh test.sh #再次执行脚本 rlb

#注意: 使用export可以在当前用户的所有环境生效。 将export定义变量写入/etc/bashrc,对所有用户永久生效。 将exprot定义变量写入.bashrc,只对该用户永久生效。

#2.使用系统已定义好的环境变量 [root@rlb ~]# cat env.sh #!/bin/bash echo "用户的家目录: $HOME" echo "当前主机名是: $HOSTNAME" echo "当前所在目录: $PWD" echo "当前连接服务器使用的地址和端口是: $SSH_CONNECTION"

[root@rlb ~]# sh env.sh 用户的家目录: /root 当前主机名是: rlb 当前所在目录: /root 当前连接服务器使用的地址和端口是: 10.0.0.1 62881 10.0.0.98 22

  1. 预先定义的变量参数示例,系统内置变量的使用方法。

#1.脚本如下:

#!/bin/bash echo "#当前shell脚本的文件名: $0" echo "#第1个shell脚本位置参数:$1" echo "#第2个shell脚本位置参数:$2" echo "#第3个shell脚本位置参数:$3" echo "#所有传递的位置参数是: $*" echo "#所有传递的位置参数是: $@" echo "#总共传递的参数个数是: $#" echo "#当前程序运行的 PID 是: $$" echo "#上一个命令执行的返回结果: $?"

#2.执行结果如下:

[root@rlb ~]# sh variable.sh linux python mysql #当前shell脚本的文件名: variable.sh #第1个shell脚本位置参数:linux #第2个shell脚本位置参数:python #第3个shell脚本位置参数:mysql #所有传递的位置参数是: linux python mysql #所有传递的位置参数是: linux python mysql #总共传递的参数个数是: 3 #当前程序运行的 PID 是: 25285 #上一个命令执行的返回结果: 0

#3.这里需要注意 \(*和\)@的区别

可以看到不加引号时,二者都是返回传入的参数,但加了引号后

$*把参数作为一个字符串整体(单字符串)返回,
$@把每个参数作为一个一个字符串返回

#测试脚本如下:

[root@qiudao ~]# cat test.sh #! /bin/bash test() { echo "未加引号,二者相同" echo $* echo $@ echo "加入引号后对比" for N in "$*" do echo $N done

echo "----------" for N in "$@" do echo $N done } test 123 456 789

#执行结果如下:

[root@qiudao ~]# sh test.sh 未加引号,二者相同

123 456 789 123 456 789 加入引号后对比

123 456 789

123 456 789 04. 位置是什么?在执行脚本的时候,在脚本后面写入的内容,按空格分隔。

[root@rlb ~]# /etc/init.d/network Usage: /etc/init.d/network {start|stop|status|restart|force-reload} [root@rlb ~]# /etc/init.d/network status #status就算第一个位置参数 $1

其它位置变量:$2..$9 ${10}

  1. 补充: 将命令执行的结果传递给变量。(命令替换)

#根据系统时间,打印今年时间和明年时间 [root@rlb ~]# echo "This is $(date +%Y) year" This is 2019 year [root@rlb ~]# echo "This is \(((\)(date +%Y)+1)) year" This is 2020 year

#自定义变量运算 [root@rlb ~]# age=18 [root@rlb ~]# echo $age 18 [root@rlb ~]# echo $(($age+1)) 19

#命令的嵌套使用,使用$($()) [root@rlb ~]# mkdir oldboy [root@rlb ~]# touch oldboy/{1..5}.txt [root@rlb ~]# data=$(tar zcvf oldboy.tar.gz $(find /root/oldboy/ -name "*.txt")) tar: Removing leading `/' from member names [root@rlb ~]# echo $data /root/oldboy/1.txt /root/oldboy/2.txt /root/oldboy/3.txt /root/oldboy/4.txt /root/oldboy/5.txt

  1. Shell变量赋值 除了自定义变量,以及系统内置变量,还可以使用read命令通过交互式方式传递变量

01.read示例语法

#示例脚本: [root@rlb ~/shell]# cat read1.sh #!/bin/bash read -p "提示信息:" var echo "你输入的变量是: $var "

#执行脚本 [root@rlb~/shell]# sh read1.sh 提示信息:oldboy 你输入的变量是: oldboy

02.read示例语法,简单备份场景

#示例脚本: [root@rlb~/shell]# cat read2.sh #!/bin/bash read -p "你要备份的目录是:" back echo "你要备份的目录是: $back " echo "-------------backuping $back ---------------" echo "-------------backup done $back -------------"

#执行脚本 [root@rlb ~/shell]# sh read2.sh 你要备份的目录是:/data 你要备份的目录是: /data -------------backuping /data --------------- -------------backup done /data -------------

  1. read示例语法,测试用户输入的IP是否通

1)执行脚本时,提示:请输入ip. 2)使用ping命令去探测用户输入的IP是否通. 3)如果通则返回存活,如果不通则返回失败.

#示例脚本: [root@rlb ~/shell]# cat read3.sh #!/bin/bash #1.提示用户输入一个IP地址 read -p "请输入需要检测的IP地址: " IP #2.使用ping命令检测IP地址是否通讯 ping -W1 -c1 $IP &>/dev/null rc=$? #3.检查上一次命令执行返回的状态码是否正常 if [ $rc -eq 0 ];then echo "$IP 能正常通信" else echo "$IP 无法正常通信" fi

#执行脚本 [root@qiudao ~/shell]# sh read3.sh 请输入需要检测的IP地址: 223.5.5.5 223.5.5.5 能正常通信

[root@rlb ~/shell]# sh read3.sh 请输入需要检测的IP地址: 233.5.5.5 233.5.5.5 无法正常通信

#echo命令输出颜色。

echo -e "\033[30m 黑色字 \033[0m" echo -e "\033[31m 红色字 \033[0m" echo -e "\033[32m 绿色字 \033[0m" echo -e "\033[33m 黄色字 \033[0m" echo -e "\033[34m 蓝色字 \033[0m" echo -e "\033[35m 紫色字 \033[0m" echo -e "\033[36m 天蓝字 \033[0m" echo -e "\033[37m 白色字 \033[0m"

[root@rlb ~/shell]# cat read3.sh #!/bin/bash #1.提示用户输入一个IP地址 read -p "请输入需要检测的IP地址: " IP #2.使用ping命令检测IP地址是否通讯 ping -W1 -c1 $IP &>/dev/null rc=$? #3.检查上一次命令执行返回的状态码是否正常 if [ $rc -eq 0 ];then echo -e "\033[32m $IP 能正常通信 \033[0m" else echo -e "\033[31m $IP 无法正常通信 \033[0m" fi

[root@rlb ~/shell]# sh read3.sh 请输入需要检测的IP地址: 223.5.5.5 223.5.5.5 能正常通信 [root@rlb ~/shell]# sh read3.sh 请输入需要检测的IP地址: 233.5.5.5 233.5.5.5 无法正常通信

  1. 使用read 命令写一个脚本修改主机名

1)提示用户输入主机名称. 2)询问用户是否确此操作. 3)真的执行.

#示例脚本 [root@rlb ~/shell]# cat read4.sh #!/bin/bash #1.提示用户输入新的主机名称,然后打印新的主机名称 read -p "请输入你想修改的主机名称: " HostName echo "你将要修改的主机名称为: $HostName"

#2.是否确认修改,如果确认则真的执行shell命令,如果不确认则退出 read -p "你确定真的要修改如下内容吗[Y|N]? " readly

#3.判断用户输入的是Y还是N,如果是Y则真的执行,如果是其他则退出 if [ $readly == "Y" ];then hostnamectl set-hostname $HostName && bash else exit fi

#执行脚本 [root@rlb ~/shell]# sh read4.sh 请输入你想修改的主机名称: web 你将要修改的主机名称为: web 你确定真的要修改如下内容吗[Y|N]? N

[root@rlb ~/shell]# sh read4.sh 请输入你想修改的主机名称: web 你将要修改的主机名称为: web 你确定真的要修改如下内容吗[Y|N]? Y [root@web ~/shell]#

  1. 使用read命令写一个脚本修改ip地址

1)提示用户输入新的ip地址主机位. 2)询问用户是否确此操作. 3)真的执行.

#示例脚本: [root@rlb ~/shell]# cat read5.sh #!/bin/bash #1.提示用户输入新的ip地址主机位,然后打印新的ip地址主机位 read -p "请输入你想修改的新的ip地址主机位: " IP echo "你将要修改的新的ip地址主机位为: $IP" #2.是否确认修改,如果确认则真的执行shell命令,如果不确认则退出 read -p "你确定真的要修改如下内容吗[Y|N]? " readly #3.判断用户输入的是Y还是N,如果是Y则真的执行,如果是其他则退出 if [ $readly == "Y" ];then oldip=ifconfig eth0 |awk -F '[ .]+' 'NR==2{print $6}' sed -i "s#\({oldip}#\)#g" /etc/sysconfig/network-scripts/ifcfg-eth[01] &&
systemctl restart network else exit fi

#执行脚本 [root@rlb~/shell]# sh read5.sh 请输入你想修改的新的ip地址主机位: 90 你将要修改的新的ip地址主机位为: 90 你确定真的要修改如下内容吗[Y|N]? Y

#卡住,重新连接新的IP地址进行连接登录。

  1. Shell变量替换

变量 说明 $ 获取变量值的长度 ${变量#匹配规则} 从头开始匹配,最短删除 ${变量##匹配规则} 从头开始匹配,最长删除 ${变量%匹配规则} 从尾开始匹配,最短删除 ${变量%%匹配规则} 从尾开始匹配,最长删除 ${变量/旧字符串/新字符串} 替换变量内的旧字符串为新字符串,只替换第一个 ${变量//旧字符串/新字符串} 替换变量内的旧字符串为新字符串,全部替换 ${变量:匹配规则:匹配规则} 索引及切片

  1. 从前往后删除变量内容

[root@rlb ~/shell]# url=www.sina.com.cn #定义变量 [root@rlb ~/shell]# echo $ #输出变量的值 www.sina.com.cn [root@rlb ~/shell]# echo ${url#.} #从前往后,最短匹配 sina.com.cn [root@rlb ~/shell]# echo ${url##.} #从前往后,最长匹配 cn

  1. 从后往前删除变量内容

[root@rlb ~]# url=www.sina.com.cn #定义变量 [root@rlb ~]# echo $ #输出变量结果 www.sina.com.cn [root@rlb ~]# echo ${url%.} #从后往前,最短匹配 www.sina.com [root@rlb ~]# echo ${url%%.} #从后往前,最长匹配 贪婪匹配 www

  1. 变量内容替换

[root@rlb shell01]# echo $
www.sina.com.cn [root@rlb shell01]# echo ${url/n/N}
www.siNa.com.cn [root@rlb shell01]# echo ${url//n/N}
www.siNa.com.cN

  1. 索引及切片

[root@rlb ~/shell]# echo $ #从0列开始,切出5列,第0-4列 www.s [root@rlb ~/shell]# echo $ #从5列开始,切出5列,第5-9列 ina.c [root@rlb ~/shell]# echo $ #去除前5列 ina.com.cn

  1. 场景实践一:查看内存当前使用状态,如果使用率超过80%则报警发邮件

1.如何查看内存 #free -m 2.如何查看内存百分比 #使用的/总的100=使用百分比 free -m|awk '/^Mem/ {print $3/$2100}'

#示例脚本 [root@rlb ~/shell]# cat mem_used.sh #!/bin/bash

监控内存使用百分比,超过百分之80则报警

free_use=$(free -m|awk '/^Mem/ {print $3/$2100}') if [ ${free_use%.} -gt 80 ];then echo "你的内存超过了百分之80,当前是$%" else echo "你的内存正常使用,当前是$%" fi

#执行脚本 [root@rlb ~/shell]# sh mem_used.sh 你的内存正常使用,当前是9.0535%

  1. 场景实践二:在每月第一天备份并压缩/etc目录的所有内容,存放到/root/bak目录,存放的形式 2019-06-20_etc.tar.gz,脚本名称为fileback,存放在/root的家目录下。

01)备份什么?
02)备份到哪?
03)使用什么方式? 04)备份的周期?

#脚本如下: [root@rlb ~/shell]# cat fileback.sh #!/usr/bin/bash DestPath=/root/bak Date=$(date +%F) #1.准备目标位置 [ ! -d $DestPath ] && mkdir -p $DestPath #2.备份到目标位置 tar czf \(DestPath/\)_etc.tar.gz /etc [root@rlb ~/shell]# sh fileback.sh

#执行脚本: [root@rlb ~/shell]# sh fileback.sh tar: Removing leading `/' from member names

#查看结果 [root@rlb ~/shell]# ll /root/bak/2019-06-25_etc.tar.gz -rw-r--r-- 1 root root 10229422 Jun 25 17:15 /root/bak/2019-06-25_etc.tar.gz

  1. 场景实践三:在/backup下创建10个.txt的文件,找到/backup目录下所有后缀名为.txt的文件

1)批量修改txt为txt.bak
2)把所有的.bak文件打包压缩为123.tar.gz
3)批量还原文件的名字,及把增加的.bak再删除

方法一:

[root@rlb~/shell]# cat mv.sh #!/usr/bin/bash #1.改名

find /backup -iname ".txt"|sed -r 's#(.)#mv \1 \1.bak#g'|bash #2.打包

tar czf /backup/123.tar.gz $(find /backup -iname "*.bak") #3.还原

find /backup -iname ".bak"|sed -r 's#(.).bak#mv \1.bak \1#g'|bash

方法二:

[root@rlb ~/shell]# cat rename.sh #!/bin/bash #定义变量

T=txt B=bak

#把backup目录下.txt结尾的文件修改成txt.bak cd /backup && rename $T $T.$B *.txt

#把所有的.bak结尾的文件打包压缩为123.tar.gz tar zcvf /backup/123.tar.gz /backup/*.bak

#还原文件的名字

rename $T.$B $T *

方法三:

[root@qiudao ~/shell]# cat for_name.sh #!/usr/bin/bash

File_txt=$(find /backup/ -type f -iname "*.txt"|xargs >/backup/txt.tt) for i in $(cat /backup/txt.tt) do mv $i $i.bak done

tar czf /backup/123.tar.gz ./*.bak

File_bak=$(find /backup/ -type f -iname ".bak" >/backup/tar.tt) for j in $(cat /backup/tar.tt) do mv $j ${j%.} done 08. 场景实践四:取出下列字符串长度小于3的单词,I am qiuzengjia teacher I am 18。

方法一:

for循环方式

[root@rlb ~/shell]# cat for.sh #!/bin/sh for i in I am qiuzengjia teacher I am 18 do [ ${#i} -lt 3 ] && echo $i done

方法二:

awk方式

[root@web01 scripts]# echo I am qiuzengjia teacher I am 18|xargs -n1|awk '{if(length<3)print}' I am I am 18

  1. Shell变量运算
  2. 整数运算,expr、\((())、\)[],不支持小数运算

操作符 含义 num1 + num2 求加 num1 - num2 求减 num1 * num2 求积 num1 / num2 求商 num1 % num2 求余

#定义变量,使用expr、\((())、\)[]、let进行加减乘除。expr必须空格隔开。

#expr

[root@rlb ~/shell]# num1=20 [root@rlb ~/shell]# num2=10 [root@rlb ~/shell]# expr $num1 + $num2 30 [root@rlb ~/shell]# expr $num1 - $num2 10 [root@rlb /shell]# expr $num1 * $num2 expr: syntax error [root@rlb /shell]# expr $num1 * $num2 200 [root@rlb/shell]# expr $num1 / $num2 2 [root@rlb/shell]# expr $num1 % $num2 0

#$(())

[root@rlb ~/shell]# echo $(( $num1 + $num2 )) 30 [root@rlb ~/shell]# echo $(( $num1 - $num2 )) 10 [root@rlb ~/shell]# echo $(( $num1 * $num2 )) 200 [root@rlb ~/shell]# echo $(( $num1 / $num2 )) 2 [root@rlb ~/shell]# echo $(( $num1 % $num2 )) 0

#$[]

[root@rlb~/shell]# echo $[ $num1 + $num2 ] 30 [root@rlb ~/shell]# echo $[ $num1 - $num2 ] 10 [root@rlb ~/shell]# echo $[ $num1 * $num2 ] 200 [root@rlb ~/shell]# echo $[ $num1 / $num2 ] 2 [root@rlb ~/shell]# echo $[ $num1 % $num2 ] 0

#let

[root@qiudao /scripts]# a=1 [root@qiudao /scripts]# let a++ [root@qiudao /scripts]# echo $a 2 [root@qiudao /scripts]# let a++ [root@qiudao /scripts]# echo $a 3 [root@qiudao /scripts]# let a-- [root@qiudao /scripts]# echo $a 2 02. 小数运算bc、awk、Python

#需要下载此命令

[root@rlb ~/shell]# yum install bc -y

[root@rlb~/shell]# num1=10 [root@rlb ~/shell]# num2=20 [root@rlb ~/shell]# echo $num1+$num2 |bc 30 [root@rlb ~/shell]# echo $num1-$num2 |bc -10 [root@rlb ~/shell]# echo $num1*$num2 |bc 200 [root@rlb ~/shell]# echo $num1/$num2 |bc 0 [root@rlb ~/shell]# echo "scale=2;$num1/$num2" |bc .50 [root@rlb ~/shell]# echo $num1^$num2 |bc 100000000000000000000 [root@rlb ~/shell]# echo $num1%$num2 |bc 10

#awk

[root@rlb /shell]# awk "BEGIN{print $num1 + $num2 }" 30 [root@rlb/shell]# awk "BEGIN{print $num1 / $num2 }" 0.5 [root@rlb~/shell]# awk "BEGIN{print $num1 - $num2 }" -10 [root@rlb ~/shell]# awk "BEGIN{print $num1 * $num2 }" 200 [root@rlb ~/shell]# awk "BEGIN{print $num1 / $num2 }" 0.5 [root@rlb ~/shell]# awk 'BEGIN{printf "%.2f\n",1/2}' 0.50 [root@rlb ~/shell]# awk "BEGIN{print $num1 ^ $num2 }" 100000000000000000000 [root@rlb ~/shell]# awk "BEGIN{print $num1 % $num2 }" 10

#Python

[root@rlb~/shell]# echo "print $num1+$num2" |python 30 [root@rlb~/shell]# echo "print $num1-$num2" |python -10 [root@rlb /shell]# echo "print $num1*$num2" |python 200 [root@rlb/shell]# echo "print $num1/$num2" |python 0 [root@rlb~/shell]# echo "print $.0/$num2" |python 0.5 [root@rlb ~/shell]# echo "print $num1%$num2" |python 10 03. 变量运算案例

案例1: 求ps axu中的VSZ列的和

[root@rlb ~/shell]# ps axuf|awk '{print $5}'|grep -v VSZ|tr "\n" "+" |sed -r 's#(.*)+#\1\n#g' |bc 16506888

案例2:做一个加减乘除的计算器

例如: 请输入第一个数字 10 请输入第二个数字 20 显示的结果 10+20=30

[root@rlb ~/shell]# cat count.sh #!/bin/bash read -p "请输入第一个数字: " num1 read -p "请输入第二个数字: " num2 echo "$num1+\(num2=\)[$num1+$num2]" echo "$num1-\(num2=\)[$num1-$num2]" echo "$num1*\(num2=\)[$num1*$num2]" echo "$num1/\(num2=\)[$num1/$num2]"

  1. Shell变量案例
  2. 使用Shell脚本打印,系统版本、内核版本平台、虚拟平台、静态主机名、eth0网卡IP地址、lo网卡IP地址、当前主机的外网IP地址curl icanhazip.com

#示例脚本如下:

[root@rlb ~/shell]# sh status.sh #!/usr/bin/bash System=$(hostnamectl |grep System|awk '{print $3,$4,$5}') Kernel=$(hostnamectl|grep Kernel|awk -F: '{print $2}') Vt=$(hostnamectl|grep Virtualization|awk '{print $2}') Statichostname=$(hostnamectl|grep "Static hostname"|awk '{print $3}') Eth0=$(ifconfig eth0|awk 'NR2{print $2}') Lo=$(ifconfig lo|awk 'NR2{print $2}') Network_T=$(curl -s icanhazip.com)

echo "当前系统版本是: $System" echo "当前系统内核是: $Kernel" echo "当前虚拟平台是: $Vt" echo "当前静态主机名是: $Statichostname" echo "当前Eth0IP地址是: $Eth0" echo "当前lo地址是: $Lo" echo "当前外网地址是: $Network_T"

#执行脚本

[root@rlb ~/shell]# sh status.sh 当前系统版本是: CentOS Linux 7 当前系统内核是: Linux 3.10.0-957.el7.x86_64 当前虚拟平台是: vmware 当前静态主机名是: qiudao 当前Eth0IP地址是: 10.0.0.90 当前lo地址是: 127.0.0.1 当前外网地址是: 139.226.173.12

  1. 需求描述:变量string="Bigdata process is Hadoop, Hadoop is open source project",执行脚本后,打印输出string变量,并给出用户以下选项:

#需求 1)打印string长度 2)删除字符串中所有的Hadoop 3)替换第一个Hadoop为Linux 4)替换全部Hadoop为Linux 用户请输入数字1|2|3|4,可以执行对应项的功能。

#脚本如下:

[root@rlb ~/shell]# cat variable.sh #!/usr/bin/bash string="Bigdata process is Hadoop, Hadoop is open source project" echo $string cat <<EOF 1)、打印string长度 2)、删除字符串中所有的Hadoop 3)、替换第一个Hadoop为Linux 4)、替换全部Hadoop为Linux EOF

read -p "请输入数字1|2|3|4: " var

if [ $var -eq 1 ];then echo 当前string变量的长度是: $ #echo 当前string变量的长度是: echo $|wc -L
fi

if [ $var -eq 2 ];then echo ${string//Hadoop/} fi

if [ $var -eq 3 ];then echo ${string/Hadoop/Linux} fi

if [ $var -eq 4 ];then echo ${string//Hadoop/Linux} fi

#执行脚本

[root@qiudao ~/shell]# sh variable.sh Bigdata process is Hadoop, Hadoop is open source project 1)、打印string长度 2)、删除字符串中所有的Hadoop 3)、替换第一个Hadoop为Linux 4)、替换全部Hadoop为Linux 请输入数字1|2|3|4,或q|Q: 1 当前string变量的长度是: 57 [root@qiudao ~/shell]# sh variable.sh Bigdata process is Hadoop, Hadoop is open source project 1)、打印string长度 2)、删除字符串中所有的Hadoop 3)、替换第一个Hadoop为Linux 4)、替换全部Hadoop为Linux 请输入数字1|2|3|4,或q|Q: 2 Bigdata process is , is open source project [root@qiudao ~/shell]# sh variable.sh Bigdata process is Hadoop, Hadoop is open source project 1)、打印string长度 2)、删除字符串中所有的Hadoop 3)、替换第一个Hadoop为Linux 4)、替换全部Hadoop为Linux 请输入数字1|2|3|4,或q|Q: 3 Bigdata process is Linux, Hadoop is open source project [root@qiudao ~/shell]# sh variable.sh Bigdata process is Hadoop, Hadoop is open source project 1)、打印string长度 2)、删除字符串中所有的Hadoop 3)、替换第一个Hadoop为Linux 4)、替换全部Hadoop为Linux 请输入数字1|2|3|4,或q|Q: 4 Bigdata process is Linux, Linux is open source project

猜你喜欢

转载自www.cnblogs.com/ronglianbing/p/11711666.html