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.定义变量,变量名=变量值。不能出现"-横杠"命令

[root@qiudao ~]# qiudao="hello shell"        #定义变量有空格时,必须使用引号

2.引用变量,$变量名

或 ${变量名}

[root@qiudao ~]# echo $qiudao
hello shell
[root@qiudao ~]# echo $qiudao_test [root@qiudao ~]# echo ${qiudao}_test
hello shell_test

3.查看变量,set显示所有变量,包括自定义变量和环境变量

[root@qiudao ~]# set |grep qiudao
HOSTNAME=qiudao
qiudao='hello shell'
[root@qiudao ~]# env|grep qiudao #只显示系统的环境变量
HOSTNAME=qiudao

4.取消变量,作用范围:仅在当前Shell中有效。

[root@qiudao ~]# unset qiudao
[root@qiudao ~]# set |grep qiudao
HOSTNAME=qiudao

5.注意事项,引用变量时注意事项,单双引号和不加引号的区别。

[root@qiudao ~]# var=$(hostname)
[root@qiudao ~]# echo $var
qiudao
[root@qiudao ~]# var="$(hostname)"
[root@qiudao ~]# echo $var
qiudao
[root@qiudao ~]# var='$(hostname)'
[root@qiudao ~]# echo $var
$(hostname)
[root@qiudao ~]# echo "$var"
$(hostname)
[root@qiudao ~]# echo '$var'
$var
[root@qiudao ~]# name=qiudao
[root@qiudao ~]# echo $name
qiudao
[root@qiudao ~]# echo $name money is $10000000000
qiudao money is 0000000000
[root@qiudao ~]# echo "$name money is $10000000000"
qiudao money is 0000000000
[root@qiudao ~]# echo '$name money is $10000000000'
$name money is $10000000000
[root@qiudao ~]# echo $name money is \$10000000000
qiudao money is $10000000000
[root@qiudao ~]# echo "$name money is \$10000000000"
qiudao money is $10000000000
[root@qiudao ~]# echo '$name money is \$10000000000'
$name money is \$10000000000
[root@qiudao ~]# echo $name money is '$10000000000'
qiudao money is $10000000000

总结:

单引号 #所见即所得,吃啥吐啥,原封不动的输出。

双引号 #与单引号类似,特殊符号会被解析(运行):$ $() ``

不加引号 #与双引号类似,如果出现空格,不会算作一个整体。

反引号 #先执行反引号里面的命令,把执行的结果显示出来。

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

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

注意:

使用export可以在当前用户的所有环境生效。

将export定义变量写入/etc/bashrc,对所有用户永久生效。

将exprot定义变量写入.bashrc,只对该用户永久生效。

#2.使用系统已定义好的环境变量

[root@qiudao ~]# cat env.sh
\#!/bin/bash
echo "用户的家目录: $HOME"
echo "当前主机名是: $HOSTNAME"
echo "当前所在目录: $PWD"
echo "当前连接服务器使用的地址和端口是: $SSH_CONNECTION" [root@qiudao ~]# sh env.sh
用户的家目录: /root
当前主机名是: qiudao
当前所在目录: /root
当前连接服务器使用的地址和端口是: 10.0.0.1 62881 10.0.0.98 22

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

#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@qiudao ~]# 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@qiudao ~]# /etc/init.d/network
Usage: /etc/init.d/network {start|stop|status|restart|force-reload}
[root@qiudao ~]# /etc/init.d/network status #status就算第一个位置参数 $1
其它位置变量:$2..$9 ${10}

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

#根据系统时间,打印今年时间和明年时间

[root@qiudao ~]# echo "This is $(date +%Y) year"
This is 2019 year
[root@qiudao ~]# echo "This is $(($(date +%Y)+1)) year"
This is 2020 year

自定义变量运算

[root@qiudao ~]# age=18
[root@qiudao ~]# echo $age
18
[root@qiudao ~]# echo $(($age+1))
19

命令的嵌套使用,使用$($())

[root@qiudao ~]# mkdir oldboy
[root@qiudao ~]# touch oldboy/{1..5}.txt
[root@qiudao ~]# data=$(tar zcvf oldboy.tar.gz $(find /root/oldboy/ -name "*.txt"))
tar: Removing leading `/' from member names
[root@qiudao ~]# 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示例语法

#示例脚本:

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

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

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

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

1)执行脚本时,提示:请输入ip.

2)使用ping命令去探测用户输入的IP是否通.

3)如果通则返回存活,如果不通则返回失败.

#示例脚本:
[root@qiudao ~/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@qiudao ~/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@qiudao ~/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@qiudao ~/shell]# sh read3.sh
请输入需要检测的IP地址: 223.5.5.5
223.5.5.5 能正常通信
[root@qiudao ~/shell]# sh read3.sh
请输入需要检测的IP地址: 233.5.5.5
233.5.5.5 无法正常通信

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

1)提示用户输入主机名称.

2)询问用户是否确此操作.

3)真的执行.

#示例脚本
[root@qiudao ~/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@qiudao ~/shell]# sh read4.sh
请输入你想修改的主机名称: web
你将要修改的主机名称为: web
你确定真的要修改如下内容吗[Y|N]? N [root@qiudao ~/shell]# sh read4.sh
请输入你想修改的主机名称: web
你将要修改的主机名称为: web
你确定真的要修改如下内容吗[Y|N]? Y

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

1)提示用户输入新的ip地址主机位.

2)询问用户是否确此操作.

3)真的执行.

#示例脚本:
[root@qiudao ~/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 #执行脚本
[root@qiudao ~/shell]# sh read5.sh
请输入你想修改的新的ip地址主机位: 90
你将要修改的新的ip地址主机位为: 90
你确定真的要修改如下内容吗[Y|N]? Y #卡住,重新连接新的IP地址进行连接登录

3. Shell变量替换

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

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

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

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

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

03. 变量内容替换

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

04. 索引及切片

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

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

1.如何查看内存         #free -m
2.如何查看内存百分比 #使用的/总的*100=使用百分比 free -m|awk '/^Mem/ {print $3/$2*100}' #示例脚本
[root@qiudao ~/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 #执行脚本
[root@qiudao ~/shell]# sh mem_used.sh
你的内存正常使用,当前是9.0535%

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

01)备份什么?

02)备份到哪?

03)使用什么方式?

04)备份的周期?

#脚本如下:
[root@qiudao ~/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
[root@qiudao ~/shell]# sh fileback.sh \#执行脚本:
[root@qiudao ~/shell]# sh fileback.sh
tar: Removing leading `/' from member names \#查看结果
[root@qiudao ~/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再删除

方法一:

[root@qiudao ~/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@qiudao ~/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@qiudao ~/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

4. Shell变量运算

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

操作符 含义
num1 + num2 求加
num1 - num2 求减
num1 * num2 求积
num1 / num2 求商
num1 % num2 求余
#定义变量,使用expr、$(())、$[]、let进行加减乘除。expr必须空格隔开。

#expr

[root@qiudao ~/shell]# num1=20
[root@qiudao ~/shell]# num2=10
[root@qiudao ~/shell]# expr $num1 + $num2
30
[root@qiudao ~/shell]# expr $num1 - $num2
10
[root@qiudao ~/shell]# expr $num1 * $num2
expr: syntax error
[root@qiudao ~/shell]# expr $num1 \* $num2
200
[root@qiudao ~/shell]# expr $num1 / $num2
2
[root@qiudao ~/shell]# expr $num1 % $num2
0 #$(()) [root@qiudao ~/shell]# echo $(( $num1 + $num2 ))
30
[root@qiudao ~/shell]# echo $(( $num1 - $num2 ))
10
[root@qiudao ~/shell]# echo $(( $num1 * $num2 ))
200
[root@qiudao ~/shell]# echo $(( $num1 / $num2 ))
2
[root@qiudao ~/shell]# echo $(( $num1 % $num2 ))
0 #$[] [root@qiudao ~/shell]# echo $[ $num1 + $num2 ]
30
[root@qiudao ~/shell]# echo $[ $num1 - $num2 ]
10
[root@qiudao ~/shell]# echo $[ $num1 * $num2 ]
200
[root@qiudao ~/shell]# echo $[ $num1 / $num2 ]
2
[root@qiudao ~/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@qiu

2.小数运算bc、awk、Python

#需要下载此命令

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

[root@qiudao ~/shell]# num1=10
[root@qiudao ~/shell]# num2=20
[root@qiudao ~/shell]# echo $num1+$num2 |bc
30
[root@qiudao ~/shell]# echo $num1-$num2 |bc
-10
[root@qiudao ~/shell]# echo $num1*$num2 |bc
200
[root@qiudao ~/shell]# echo $num1/$num2 |bc
0
[root@qiudao ~/shell]# echo "scale=2;$num1/$num2" |bc
.50
[root@qiudao ~/shell]# echo $num1^$num2 |bc
100000000000000000000
[root@qiudao ~/shell]# echo $num1%$num2 |bc
10 #awk [root@qiudao ~/shell]# awk "BEGIN{print $num1 + $num2 }"
30
[root@qiudao ~/shell]# awk "BEGIN{print $num1 / $num2 }"
0.5
[root@qiudao ~/shell]# awk "BEGIN{print $num1 - $num2 }"
-10
[root@qiudao ~/shell]# awk "BEGIN{print $num1 * $num2 }"
200
[root@qiudao ~/shell]# awk "BEGIN{print $num1 / $num2 }"
0.5
[root@qiudao ~/shell]# awk 'BEGIN{printf "%.2f\n",1/2}'
0.50
[root@qiudao ~/shell]# awk "BEGIN{print $num1 ^ $num2 }"
100000000000000000000
[root@qiudao ~/shell]# awk "BEGIN{print $num1 % $num2 }"
10 #Python [root@qiudao ~/shell]# echo "print $num1+$num2" |python
30
[root@qiudao ~/shell]# echo "print $num1-$num2" |python
-10
[root@qiudao ~/shell]# echo "print $num1*$num2" |python
200
[root@qiudao ~/shell]# echo "print $num1/$num2" |python
0
[root@qiudao ~/shell]# echo "print ${num1}.0/$num2" |python
0.5
[root@qiudao ~/shell]# echo "print $num1%$num2" |python
10

3.变量运算案例

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

[root@qiudao ~/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@qiudao ~/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

#示例脚本如下:

[root@qiudao ~/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" \#执行脚本 [root@qiudao ~/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

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,可以执行对应项的功能。

cat string.sh

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 "please input your number[1\2\3\4\]: " num1 if [ $num1 == 1 ];then
echo ${#string}
elif [ $num1 == 2 ];then
echo ${string//Hadoop}
elif [ $num1 == 4 ];then
echo ${string//Hadoop/linux}
elif [ $num1 == 3 ];then
echo ${string/Hadoop/linux}
else
echo "输入错误" fi

Shell变量概述的更多相关文章

  1. Shell 变量简介

    1. 概述 概述 知识点又稀又碎, 面试一问就流泪 简单介绍下 shell 下的变量及其基本操作 2. 环境 操作系统 CentOS Linux release 7.5 用户 root 用户 约定 使 ...

  2. Shell基本概述

    目录 Shell01--基本概述 1. Shell课程大纲介绍 2. 什么是Shell ? 3. 什么是Shell脚本 ? 4. 为什么要学Shell编程 ? 5. 学习Shell编程需要哪些知识 ? ...

  3. shell变量

    定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名 ...

  4. linux中shell变量$#,$@,$0,$1,$2的含义解释

    linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...

  5. awk使用shell变量

    awk使用shell变量  (可以计算浮点数) 其实在awk里,是不能直接使用shell变量的 方法是:awk -v 选项让awk 里使用shell变量 TIME=60 awk -v time=&qu ...

  6. shell变量详解

    1 shell变量基础 shell变量是一种很"弱"的变量,默认情况下,一个变量保存一个串,shell不关心这个串是什么含义.所以若要进行数学运算,必须使用一些命令例如let.de ...

  7. 三、Shell变量类型和运算符

    一.Shell变量的应用 1.Shell变量的种类     ·用户自定义变量:由用户自己定义.修改和使用     ·预定义变量:Bash预定义的特殊变量,不能直接修改     ·位置变量:通过命令行给 ...

  8. Shell入门教程:Shell变量

    变量 是一种很“弱”的变量,默认情况下,一个变量保存一个串,Shell不关心这个串是什么含义.所以若要进行数学运算,必须使用一些命令例如 let.declare.expr.双括号等. Shell变量可 ...

  9. 【整理】--C++变量概述

    1.变量概述及特殊变量初始化 a.引用 b.常量 c.静态 d.静态常量(整型) e.静态常量(非整型) 初始化:常量和引用,必须通过参数列表进行初始化. 静态成员变量的初始化也颇有点特别,是在类外初 ...

随机推荐

  1. linux部署.net Core项目

    首篇笔记,多多关照.方便回忆和给新手指导,大神绕道 首先在Linux系统部署.net Core项目首先准备一个Linux系统的服务器,百度云,阿里云都行. 1.net core 部署在Linux系统上 ...

  2. OLTP

    On-Line Transaction Processing,联机事务处理过程(OLTP),也称为面向交易的处理过程 其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理,并在很短的时间内给出 ...

  3. OWASP ModSecurity Core Rule Set (CRS)的基本使用

    Preface 前述文章开源WAF工具ModSecurity,介绍了ModSecurity作为Nginx的动态加载模块的基本安装和使用. 本篇简单介绍ModSecurity CRS规则集的使用. # ...

  4. STM32F407外部晶体改为25M后检测不到芯片的解决办法

    问题描述 分享一个之前遇到的STM32F4晶体频率问题,导致单片机死机的解决办法.使用一款新的F4开发板,直接使用的正点原子STM32F407工程模板代码,管脚配置正确,下载到外部晶体为25MHz的开 ...

  5. Java 读取excel表格文件

    注意,本文使用的Jar包为jxl.jar,只能处理97-03版本xls格式的Excel jar包 maven依赖: <dependency> <groupId>net.sour ...

  6. centos7 laravel 项目 npm install报错

    npm install 初始化项目依赖的前端资源   报错 ERR xxx .. socket,symbol link is not supported ... 如果报错了 重新npm install ...

  7. pandas 过滤

    条件过滤 通过loc进行行过滤,也可对过滤后的行进行赋值 import pandas as pd df = pd.DataFrame({"name": ["yang&qu ...

  8. 使用 Flutter 开发 Mac 桌面应用

    Flutter 可以开发 Mac,Linux,Windows 桌面,但是对于平台目前只能打对于的包,以及调试本平台的包. 切换到 master 分支 首先必须切换到 master 分支.我之前在 de ...

  9. 从简单Sql探索优化之道

    从简单Sql探索优化之道 梁敬彬 2016-03-17 09:39:41 本文需要优化的语句是select count(*) from t,这简单的统计语句一出,估计不少人纳闷了,能有啥优化空间,还优 ...

  10. Linux系统学习 二十、SAMBA服务—介绍、安装、端口

    1.简介 网络数据文件共享服务器 可以和Windows中的网上邻居通用 数据共享的方法: Windows中最常用的是“网上邻居”.网上邻居使用的文件系统是CIFS(通用互联网文件系统)协议进行数据共享 ...