第二章 Shell变量

第二章 Shell变量

1. shell变量概述

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

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

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

3. Shell变量定义的方式

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

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

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

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

4. Shell变量定义实践

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

#1.定义变量,变量名=变量值。不能出现"-横岗"命令
[[email protected]~]# gjy="hello shell"        #定义变量有空格时,必须使用引号
#2.引用变量,$变量名
或 ${变量名}
[[email protected] ~]# echo $gjy
hello shell
[[email protected] ~]# echo $gjy_test[[email protected] ~]# echo ${gjy}_test
hello shell_test
#3.查看变量,set显示所有变量,包括自定义变量和环境变量
[[email protected] ~]# set |grep gjy
HOSTNAME=gjy
gjy='hello shell'
[[email protected] ~]# env|grep gjy       #只显示系统的环境变量
HOSTNAME=gjy
#4.取消变量,作用范围:仅在当前Shell中有效。
[[email protected] ~]# unset gjy
[[email protected] ~]# set |grep gjy
HOSTNAME=gjy
#5.注意事项,引用变量时注意事项,单双引号和不加引号的区别。
[[email protected] ~]# var=$(hostname)
[[email protected] ~]# echo $var
gjy
[[email protected] ~]# var="$(hostname)"
[[email protected] ~]# echo $var
gjy
[[email protected] ~]# var='$(hostname)'
[[email protected] ~]# echo $var
$(hostname)
[[email protected] ~]# echo "$var"
$(hostname)
[[email protected] ~]# echo '$var'
$var
[[email protected] ~]# name=gjy
[[email protected] ~]# echo $name
gjy
[[email protected] ~]# echo $name money is $10000000000
gjy money is 0000000000
[[email protected] ~]# echo "$name money is $10000000000"
gjy money is 0000000000
[[email protected] ~]# echo '$name money is $10000000000'
$name money is $10000000000
[[email protected] ~]# echo $name money is \$10000000000
gjy money is $10000000000
[[email protected] ~]# echo "$name money is \$10000000000"
gjy money is $10000000000
[[email protected] ~]# echo '$name money is \$10000000000'
$name money is \$10000000000
[[email protected] ~]# echo $name money is '$10000000000'
gjy money is $10000000000

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

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

#1.定义环境变量:export 变量,将自定义变量转换成环境变量。
[[email protected] ~]# echo $name
gjy
[[email protected] ~]# cat test.sh
#!bin/bash
echo $name
[[email protected] ~]# sh test.sh                #执行脚本时,会调用另一个bash执行,就访问不到$name的值。
[[email protected] ~]# export name=gjy        #将变量转换为环境变量
[[email protected] ~]# sh test.sh                #再次执行脚本
gjy
#注意:
使用export可以在当前用户的所有环境生效。
将export定义变量写入/etc/bashrc,对所有用户永久生效。
将exprot定义变量写入.bashrc,只对该用户永久生效。
#2.使用系统已定义好的环境变量
[[email protected] ~]# cat env.sh
#!/bin/bash
echo "用户的家目录: $HOME"
echo "当前主机名是: $HOSTNAME"
echo "当前所在目录: $PWD"
echo "当前连接服务器使用的地址和端口是: $SSH_CONNECTION"[[email protected] ~]# sh env.sh
用户的家目录: /root
当前主机名是: gjy
当前所在目录: /root
当前连接服务器使用的地址和端口是: 10.0.0.1 62881 10.0.0.98 22

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

#1.脚本如下:#!/bin/bash
echo "#当前shell脚本的文件名: $0"
echo "#第1个shell脚本位置参数:$1"
echo "#第2个shell脚本位置参数:$2"
echo "#第3个shell脚本位置参数:$3"
echo "#所有传递的位置参数是: $*"
echo "#所有传递的位置参数是: [email protected]"
echo "#总共传递的参数个数是: $#"
echo "#当前程序运行的 PID 是: $$"
echo "#上一个命令执行的返回结果: $?"#2.执行结果如下:
[[email protected] ~]# 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.这里需要注意 $*和[email protected]的区别
可以看到不加引号时,二者都是返回传入的参数,但加了引号后
$*把参数作为一个字符串整体(单字符串)返回,
[email protected]把每个参数作为一个一个字符串返回#测试脚本如下:
[[email protected] ~]# cat test.sh
#! /bin/bash
test() {
echo "未加引号,二者相同"
echo $*
echo [email protected]
echo "加入引号后对比"
for N in "$*"
do
echo $N
doneecho "----------"
for N in "[email protected]"
do
echo $N
done
}
test 123 456 789
#执行结果如下:
[[email protected] ~]# sh test.sh
未加引号,二者相同123 456 789
123 456 789
加入引号后对比123 456 789
----------
123
456
789

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

[[email protected] ~]# /etc/init.d/network
Usage: /etc/init.d/network {start|stop|status|restart|force-reload}
[[email protected] ~]# /etc/init.d/network status    #status就算第一个位置参数 $1其它位置变量:$2..$9 ${10}

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

#根据系统时间,打印今年时间和明年时间
[[email protected] ~]# echo "This is $(date +%Y) year"
This is 2019 year
[[email protected] ~]# echo "This is $(($(date +%Y)+1)) year"
This is 2020 year#自定义变量运算
[[email protected] ~]# age=18
[[email protected] ~]# echo $age
18
[[email protected] ~]# echo $(($age+1))
19
#命令的嵌套使用,使用$($())
[[email protected] ~]# mkdir oldboy
[[email protected] ~]# touch oldboy/{1..5}.txt
[[email protected] ~]# data=$(tar zcvf oldboy.tar.gz $(find /root/oldboy/ -name "*.txt"))
tar: Removing leading `/' from member names
[[email protected] ~]# echo $data
/root/oldboy/1.txt /root/oldboy/2.txt /root/oldboy/3.txt /root/oldboy/4.txt /root/oldboy/5.txt

2. Shell变量赋值

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

01.read示例语法

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

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

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

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

1)执行脚本时,提示:请输入ip.
2)使用ping命令去探测用户输入的IP是否通.
3)如果通则返回存活,如果不通则返回失败.#示例脚本:
[[email protected] ~/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

#执行脚本
[[email protected] ~/shell]# sh read3.sh
请输入需要检测的IP地址: 223.5.5.5
223.5.5.5 能正常通信
[[email protected] ~/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"

[[email protected] ~/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

[[email protected] ~/shell]# sh read3.sh
请输入需要检测的IP地址: 223.5.5.5
223.5.5.5 能正常通信

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

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

1)提示用户输入主机名称.
2)询问用户是否确此操作.
3)真的执行.#示例脚本
[[email protected] ~/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
#执行脚本
[[email protected] ~/shell]# sh read4.sh
请输入你想修改的主机名称: web
你将要修改的主机名称为: web
你确定真的要修改如下内容吗[Y|N]? N
[[email protected] ~/shell]# sh read4.sh
请输入你想修改的主机名称: web
你将要修改的主机名称为: web
你确定真的要修改如下内容吗[Y|N]? Y

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

1)提示用户输入新的ip地址主机位.
2)询问用户是否确此操作.
3)真的执行.#示例脚本:
[[email protected] ~/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}#${IP}#g" /etc/sysconfig/network-scripts/ifcfg-eth[01] &&     systemctl restart network
else
exit
fi
#执行脚本
[[email protected] ~/shell]# sh read5.sh
请输入你想修改的新的ip地址主机位: 90
你将要修改的新的ip地址主机位为: 90
你确定真的要修改如下内容吗[Y|N]? Y
#卡住,重新连接新的IP地址进行连接登录。

3. Shell变量替换

变量说明

${#变量} 获取变量值的长度

${变量#匹配规则} 从头开始匹配,最短删除

${变量##匹配规则} 从头开始匹配,最长删除

${变量%匹配规则} 从尾开始匹配,最短删除

${变量%%匹配规则} 从尾开始匹配,最长删除

${变量/旧字符串/新字符串} 替换变量内的旧字符串为新字符串,只替换第一个

${变量//旧字符串/新字符串} 替换变量内的旧字符串为新字符串,全部替换

${变量:匹配规则:匹配规则} 索引及切片

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

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

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

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

03. 变量内容替换

[[email protected] shell01]# echo ${url}
www.sina.com.cn
[[email protected] shell01]# echo ${url/n/N}
www.siNa.com.cn
[[email protected] shell01]# echo ${url//n/N}
www.siNa.com.cN

04. 索引及切片

[[email protected] ~/shell]# echo ${url:0:5}            #从0列开始,切出5列,第0-4列
www.s
[[email protected] ~/shell]# echo ${url:5:5}            #从5列开始,切出5列,第5-9列
ina.c
[[email protected] ~/shell]# echo ${url:5}            #去除前5列
ina.com.cn

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

1.如何查看内存         #free -m
2.如何查看内存百分比        #使用的/总的*100=使用百分比 free -m|awk '/^Mem/ {print $3/$2*100}'#示例脚本
[[email protected] ~/shell]# cat mem_used.sh
#!/bin/bash
# 监控内存使用百分比,超过百分之80则报警
free_use=$(free -m|awk '/^Mem/ {print $3/$2*100}')
if [ ${free_use%.*} -gt 80 ];then
    echo "你的内存超过了百分之80,当前是${free_use}%"
else
    echo "你的内存正常使用,当前是${free_use}%"
fi#执行脚本
[[email protected] ~/shell]# sh mem_used.sh
你的内存正常使用,当前是9.0535%

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

01)备份什么?
02)备份到哪?
03)使用什么方式?
04)备份的周期?    #脚本如下:
[[email protected] ~/shell]# cat fileback.sh
#!/usr/bin/bash
DestPath=/root/bak
Date=$(date +%F)
#1.准备目标位置
[ ! -d $DestPath ] && mkdir -p $DestPath
#2.备份到目标位置
tar czf $DestPath/${Date}_etc.tar.gz /etc
[[email protected] ~/shell]# sh fileback.sh#执行脚本:
[[email protected] ~/shell]# sh fileback.sh
tar: Removing leading `/' from member names#查看结果
[[email protected] ~/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

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

1)批量修改txt为txt.bak
2)把所有的.bak文件打包压缩为123.tar.gz
3)批量还原文件的名字,及把增加的.bak再删除
方法一:
[[email protected] ~/shell]# cat mv.sh
#!/usr/bin/bash
dir=/backup
#1.判断目录是否存在,不存在则创建
if [ -d $dir ];then
    echo " $dir已存在"
else
    echo " $dir不存在,现在创建" && mkdir -p $dir
fi
#创建10个文件
touch $dir/{1..10}.txt
#2.批量修改名称
find $dir -type f -name "*.txt" > $dir/txt.log
sed -r 's#(.*)#mv \1 \1.bak#g' $dir/txt.log |bash
#3.打包压缩
tar czf $dir/123.tar.gz $dir/*.bak
#4.还原
find $dir -type f -name "*.bak" > $dir/bak.log
sed -r 's#(.*).bak#mv \1.bak \1#g' $dir/bak.log|bash

方法二:
[[email protected] ~/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
*方法三:
[[email protected] ~/shell]# cat for_name.sh
#!/bin/bash
dir=/backup
#1.判断目录是否存在,不存在则创建
[ -d $dir ] || mkdir -p $dir
#创建10个文件
touch $dir/{1..10}.txt
#批量修改文件名
find $dir -type f -name "*.txt" >$dir/txt.log
#2.使用for循环进行修改名
for i in $(cat $dir/txt.log)
do
mv $i $i.bak
done
#3.打包压缩
tar czf $dir/123.tar.gz  $dir/*.bak
#4.批量还原
find $dir -type f -name "*.bak" > $dir/bak.log
for j in $(cat $dir/bak.log)
do
mv $j ${j%.*}
done

4. Shell变量运算

01. 整数运算,expr、\((())、\)[],不支持小数运算

操作符含义

num1 + num2 求加

num1 - num2 求减

num1 * num2 求积

num1 / num2 求商

num1 % num2 求余

#定义变量,使用expr、$(())、$[]、let进行加减乘除。expr必须空格隔开。
#expr
[[email protected] ~/shell]# num1=20
[[email protected] ~/shell]# num2=10
[[email protected] ~/shell]# expr $num1 + $num2
30
[[email protected] ~/shell]# expr $num1 - $num2
10
[[email protected] ~/shell]# expr $num1 * $num2
expr: syntax error
[[email protected] ~/shell]# expr $num1 \* $num2
200
[[email protected] ~/shell]# expr $num1 / $num2
2
[[email protected] ~/shell]# expr $num1 % $num2
0

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

#let
[[email protected] /scripts]# a=1
[[email protected] /scripts]# let a++
[[email protected] /scripts]# echo $a
2
[[email protected] /scripts]# let a++
[[email protected] /scripts]# echo $a
3
[[email protected] /scripts]# let a--
[[email protected] /scripts]# echo $a
2

02. 小数运算bc(支持求方)、awk(支持求方)、Python

#需要下载此命令
[[email protected] ~/shell]# yum install bc -y
[[email protected] ~/shell]# num1=10
[[email protected] ~/shell]# num2=20
[[email protected] ~/shell]# echo $num1+$num2 |bc
30
[[email protected] ~/shell]# echo $num1-$num2 |bc
-10
[[email protected] ~/shell]# echo $num1*$num2 |bc
200
[[email protected] ~/shell]# echo $num1/$num2 |bc
0
[[email protected] ~/shell]# echo "scale=2;$num1/$num2" |bc
.50
[[email protected] ~/shell]# echo $num1^$num2 |bc
100000000000000000000
[[email protected] ~/shell]# echo $num1%$num2 |bc
10
#awk
[[email protected] ~/shell]# awk "BEGIN{print $num1 + $num2 }"
30
[[email protected] ~/shell]# awk "BEGIN{print $num1 / $num2 }"
0.5
[[email protected] ~/shell]# awk "BEGIN{print $num1 - $num2 }"
-10
[[email protected] ~/shell]# awk "BEGIN{print $num1 * $num2 }"
200
[[email protected] ~/shell]# awk "BEGIN{print $num1 / $num2 }"
0.5
#指定小数位
[[email protected] ~/shell]# awk 'BEGIN{printf "%.2f\n",1/2}'
0.50
[[email protected] ~/shell]# awk "BEGIN{print $num1 ^ $num2 }"
100000000000000000000
[[email protected] ~/shell]# awk "BEGIN{print $num1 % $num2 }"
10

#Python
[[email protected] ~/shell]# echo "print $num1+$num2" |python
30
[[email protected] ~/shell]# echo "print $num1-$num2" |python
-10
[[email protected] ~/shell]# echo "print $num1*$num2" |python
200
[[email protected] ~/shell]# echo "print $num1/$num2" |python
0
[[email protected] ~/shell]# echo "print ${num1}.0/$num2" |python
0.5
[[email protected] ~/shell]# echo "print $num1%$num2" |python
10
**03. 变量运算案例**
案例1: 求ps axu中的VSZ列的和
[[email protected] shell]# ps aux |awk  'NR>=2 {print $5}'|awk '{sum+=$1}END {print sum}'
17039904
[[email protected] shell]# ps aux |awk  'NR>=2 {print $5}'|tr "\n" "+" |sed -r 's#(.*)\+#\1\n#g'|bc
16849512
[[email protected] shell]# ps aux |awk  'NR>=2 {print $5}'|awk '{i+=$1}END{print i}'
17084196

03. 变量运算案例

案例2:做一个加减乘除的计算器例如:
请输入第一个数字 10
请输入第二个数字 20
显示的结果 10+20=30[[email protected] ~/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]"

5. Shell变量案例

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

#示例脚本如下:[[email protected] ~/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 'NR==2{print $2}')
Lo=$(ifconfig lo|awk 'NR==2{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"

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

02. 需求描述:变量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,可以执行对应项的功能。
#脚本如下:
[[email protected] ~/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变量的长度是: ${#string}
#echo 当前string变量的长度是: echo ${string}|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
#执行脚本
[[email protected] ~/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
[[email protected] ~/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
[[email protected] ~/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
[[email protected] ~/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

取出下列字符串长度小于3的单词,I am qiuzengjia teacher I am 18。

[[email protected] backup]# cat bbb.sh
#!/bin/bash
abc="I am qiuzengjia teacher I am 18"
echo $abc
for i in $abc
do
    if [ ${#i} -lt 3 ];then
         echo "长度小于3:$i"
    else
        echo "长度大于或等于3: $i"
    fi
done
[[email protected] backup]# sh bbb.sh
I am qiuzengjia teacher I am 18
长度小于3:I
长度小于3:am
长度大于或等于3: qiuzengjia
长度大于或等于3: teacher
长度小于3:I
长度小于3:am
长度小于3:18

原文地址:https://www.cnblogs.com/gongjingyun123--/p/11724064.html

时间: 2024-10-07 05:02:36

第二章 Shell变量的相关文章

Shell编程从入门到精通-第二章.shell变量

二.Shell变量 2.1.什么是变量 在小学的时候我们学过数学方程式,例如:已知x=1,y=x+1那么y等于多少 在上述的题目中x和y被称为未知数,但是在shell编程里它们是变量名,等号右边的1和x+1是变量的内容,(这里"="被称为赋值) 通过上面的介绍可以得出,变量就是用一个固定的字符串代替更多,更复杂的内容,该内容包含变量.路径.字符串等其他的内容,变量是暂时存储数据的地方和标记,所存储的数据存在内存空间中,通过调用内容空间的变量名字就可以取出变量对应的数据.使用变量最大的好

第二章 Shell变量定义

1. Shell变量概述 1. 什么是变量 变量是Shell传递数据的一种方法,简单理解:用一个固定的字符串去表示不固定的内容,便于后续引用. 2.变量命令规范 变量定义时名称有要求:字母.数字.下划线几个组成,尽量字母开头,变量名最好具备一定的含义. ip=10.0.0.100 ip1=10.0.0.100 Hostname_Ip=10.0.0.100 hostname_IP=10.0.0.100 等号是赋值,需要注意:等号两边不能有空格,其次定义的变量不要与系统命令出现冲突. 3. Shel

《跟老男孩学Linux运维之shell编程实战》-第二章 shell变量的核心基础

这篇文章主要讲解 shell变量的核心基础. 1.变量是什么? 变量是什么?可能有好多人不明白,简单地说,变量就是用一个固定的字符串(也可能是字符.数字等的组合)代替更多.更复杂的内容,该内容里可能还会包含变量.路径.字符串等其他的内容. 变量的赋值方式为:先写变量名称,紧接着是"="这个字符,最后是值,中间无任何空格(变量的内容一般要加双引号,以防止出错,特别是当值里的内容之间有空格时). 如何打印变量?通过echo命令加上$变量名 打印变量的值: 例如:定义变量和打印变量: [[e

[第二章]Shell 变量

一.变量 变量就是使用一个较简单的字符串来代替某些具有特殊意义的设定以及数据.就拿PATH来说,这个PATH就代替了所有常用命令的绝对路径的设定,有了PATH这个变量,我们运行某个命令时就不再需要输入全局路径,直接输入命令名即可. [[email protected] ~]# echo $PATH <==输出PATH变量 /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin [[email protected

【C语言探索之旅】 第一部分第四课第二章:变量的世界之变量声明

内容简介 1.课程大纲 2.第一部分第四课第二章:变量的世界之变量声明 3.第一部分第四课第三章预告:变量的世界之显示变量内容 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算符 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理

perl5 第二章 简单变量

第二章 简单变量  by flamephoenix 一.整型 二.浮点数 三.字符串 基本上,简单变量就是一个数据单元,这个单元可以是数字或字符串.一.整型 1.整型   PERL最常用的简单变量,由于其与其它语言基本相同,不再赘述.   例:   $x = 12345;   if (1217 + 116 == 1333) {   # statement block goes here   }  整型的限制:   PERL实际上把整数存在你的计算机中的浮点寄存器中,所以实际上被当作浮点数看待.在

机器学习 Machine Learning(by Andrew Ng)----第二章 单变量线性回归(Linear Regression with One Variable)

第二章 单变量线性回归(Linear Regression with One Variable) <模型表示(Model Representation)>                                                             <代价函数(Cost Function)>                                                          <梯度下降(Gradient Descent)

《跟老男孩学Linux运维之shell编程实战》-第三章 shell变量知识进阶

本文讲解shell变量知识进阶. 以下为知识点的总结,关于练习,本文不不涉及,还需要各位小伙伴自己练习! 1.shell中的特殊位置参数变量,请见下表: 在企业场景下,"$?"的用法: (1)判断命令.脚本或函数等程序是否执行成功: (2)若在脚本中调用执行"exit 数字",则会返回这个数字给"$?"变量: (3)如果是在函数里,则通过"return  数字",把这个数字以函数返回值的形式传给"$?".

第二章 Shell编程之变量

Shell编程之变量 一 Bash变量与变量分类 Bash是Linux中的标准Shell,因此经常称Bash为Shell. 1. 变量命名规则 变量名可以由字母.数字.下划线组成,但必须以字母与下划线开头: 变量名的长度不能超过255个字符: 变量名在有效范围必须唯一: 在Bash中,变量的默认类型都字符串型: 2. 变量按照存储类型分类 默认类型是字符串型. 字符串型,赋值时单双引号皆可: 整形: 浮点型: 日期型: 二 用户自定义变量 变量名与变量值都是用户自定义的,就是说可以由用户控制修改