Shell02---变量

1. shell变量概述

1. 什么是变量

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

2.变量命令规范

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

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

3. Shell变量定义的方式

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

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

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

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

4. Shell变量定义实践

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

  1. #1.定义变量,变量名=变量值。不能出现"-横岗"命令
  2. [root@gjy~]# gjy="hello shell" #定义变量有空格时,必须使用引号
  3. #2.引用变量,$变量名
  4. ${变量名}
  5. [root@gjy ~]# echo $gjy
  6. hello shell
  7. [root@gjy ~]# echo $gjy_test[root@gjy ~]# echo ${gjy}_test
  8. hello shell_test
  9. #3.查看变量,set显示所有变量,包括自定义变量和环境变量
  10. [root@gjy ~]# set |grep gjy
  11. HOSTNAME=gjy
  12. gjy='hello shell'
  13. [root@gjy ~]# env|grep gjy #只显示系统的环境变量
  14. HOSTNAME=gjy
  15. #4.取消变量,作用范围:仅在当前Shell中有效。
  16. [root@gjy ~]# unset gjy
  17. [root@gjy ~]# set |grep gjy
  18. HOSTNAME=gjy
  19. #5.注意事项,引用变量时注意事项,单双引号和不加引号的区别。
  20. [root@gjy ~]# var=$(hostname)
  21. [root@gjy ~]# echo $var
  22. gjy
  23. [root@gjy ~]# var="$(hostname)"
  24. [root@gjy ~]# echo $var
  25. gjy
  26. [root@gjy ~]# var='$(hostname)'
  27. [root@gjy ~]# echo $var
  28. $(hostname)
  29. [root@gjy ~]# echo "$var"
  30. $(hostname)
  31. [root@gjy ~]# echo '$var'
  32. $var
  33. [root@gjy ~]# name=gjy
  34. [root@gjy ~]# echo $name
  35. gjy
  36. [root@gjy ~]# echo $name money is $10000000000
  37. gjy money is 0000000000
  38. [root@gjy ~]# echo "$name money is $10000000000"
  39. gjy money is 0000000000
  40. [root@gjy ~]# echo '$name money is $10000000000'
  41. $name money is $10000000000
  42. [root@gjy ~]# echo $name money is \$10000000000
  43. gjy money is $10000000000
  44. [root@gjy ~]# echo "$name money is \$10000000000"
  45. gjy money is $10000000000
  46. [root@gjy ~]# echo '$name money is \$10000000000'
  47. $name money is \$10000000000
  48. [root@gjy ~]# echo $name money is '$10000000000'
  49. gjy money is $10000000000

总结:

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

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

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

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

  1. #1.脚本如下:#!/bin/bash
  2. echo "#当前shell脚本的文件名: $0"
  3. echo "#第1个shell脚本位置参数:$1"
  4. echo "#第2个shell脚本位置参数:$2"
  5. echo "#第3个shell脚本位置参数:$3"
  6. echo "#所有传递的位置参数是: $*"
  7. echo "#所有传递的位置参数是: $@"
  8. echo "#总共传递的参数个数是: $#"
  9. echo "#当前程序运行的 PID 是: $$"
  10. echo "#上一个命令执行的返回结果: $?"
  11. #2.执行结果如下:
  12. [root@gjy ~]# sh variable.sh linux python mysql
  13. #当前shell脚本的文件名: variable.sh
  14. #第1个shell脚本位置参数:linux
  15. #第2个shell脚本位置参数:python
  16. #第3个shell脚本位置参数:mysql
  17. #所有传递的位置参数是: linux python mysql
  18. #所有传递的位置参数是: linux python mysql
  19. #总共传递的参数个数是: 3
  20. #当前程序运行的 PID 是: 25285
  21. #上一个命令执行的返回结果: 0
  1. #3.这里需要注意 $*和$@的区别
  2. 可以看到不加引号时,二者都是返回传入的参数,但加了引号后
  3. $*把参数作为一个字符串整体(单字符串)返回,
  4. $@把每个参数作为一个一个字符串返回#测试脚本如下:
  5. [root@gjy ~]# cat test.sh
  6. #! /bin/bash
  7. test() {
  8. echo "未加引号,二者相同"
  9. echo $*
  10. echo $@
  11. echo "加入引号后对比"
  12. for N in "$*"
  13. do
  14. echo $N
  15. doneecho "----------"
  16. for N in "$@"
  17. do
  18. echo $N
  19. done
  20. }
  21. test 123 456 789
  22. #执行结果如下:
  23. [root@gjy ~]# sh test.sh
  24. 未加引号,二者相同123 456 789
  25. 123 456 789
  26. 加入引号后对比123 456 789
  27. ----------
  28. 123
  29. 456
  30. 789

总结:

  1. 重要的特殊位置变量
  2. $0 脚本的名称,如果全路径执行脚本,则脚本名称也带全路径, basename 获取全脚本名称
  3. 案例:给用户提示如何使用此脚本
  4. echo $"Usage: $0 {start |stop |status | restart |force-reload}"
  5. $n 脚本的第n个参数, $0被脚本占用,从 $1开始,$9以后 ,需要加{}
  6. $# 代表了脚本的传参的总个数
  7. 案例: [ $# -ne 2 ] && echo " 你请输入两个参数 " && exit
  8. $* 脚本的所有的传参的参数,如果不加双引号则和$@相同 加上双引号则把所有参数视为一个整体
  9. $@ 脚本的所有的传参的参数 如果不加双引号则和$* 相同, 加上双引号则把所有参数视为独立的参数
  10. $* $@ 正常情况下一样, 循环体内不同
  11. $? 获取上一条命令的结果,0为成功,非0 代表失败
  12. $$ 获取脚本的pid
  13. 案例: 服务器运行大量的名称相同的脚本
  14. echo $$ > /tmp/count.pid
  15. $! 上一个在后台运行脚本的pid 调试使用
  16. $_ 获取脚本的最后一个参数,相当于Esc .

传参的三种方式

  1. 1. 直接传参
  2. 2.赋值传参
  3. 3. read 传参
  4. #第一种传参方式
  5. echo $1 $2
  6. #第二种
  7. name= $1
  8. age=$2
  9. echo $name $age
  10. read -p "请输入名字和年龄" name1 age1
  11. echo $name1 $age1

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

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

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

  1. #根据系统时间,打印今年时间和明年时间
  2. [root@gjy ~]# echo "This is $(date +%Y) year"
  3. This is 2019 year
  4. [root@gjy ~]# echo "This is $(($(date +%Y)+1)) year"
  5. This is 2020 year#自定义变量运算
  6. [root@gjy ~]# age=18
  7. [root@gjy ~]# echo $age
  8. 18
  9. [root@gjy ~]# echo $(($age+1))
  10. 19
  11. #命令的嵌套使用,使用$($())
  12. [root@gjy ~]# mkdir oldboy
  13. [root@gjy ~]# touch oldboy/{1..5}.txt
  14. [root@gjy ~]# data=$(tar zcvf oldboy.tar.gz $(find /root/oldboy/ -name "*.txt"))
  15. tar: Removing leading `/' from member names
  16. [root@gjy ~]# echo $data
  17. /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示例语法

  1. #示例脚本:
  2. [root@gjy ~/shell]# cat read1.sh
  3. #!/bin/bash
  4. read -p "提示信息:" var
  5. echo "你输入的变量是: $var "
  6. #执行脚本
  7. [root@gjy ~/shell]# sh read1.sh
  8. 提示信息:oldboy
  9. 你输入的变量是: oldboy

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

  1. #示例脚本:
  2. [root@gjy ~/shell]# cat read2.sh
  3. #!/bin/bash
  4. read -p "你要备份的目录是:" back
  5. echo "你要备份的目录是: $back "
  6. echo "-------------backuping $back ---------------"
  7. echo "-------------backup done $back -------------"#执行脚本
  8. [root@gjy ~/shell]# sh read2.sh
  9. 你要备份的目录是:/data
  10. 你要备份的目录是: /data
  11. -------------backuping /data ---------------
  12. -------------backup done /data -------------

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

  1. 1)执行脚本时,提示:请输入ip.
  2. 2)使用ping命令去探测用户输入的IP是否通.
  3. 3)如果通则返回存活,如果不通则返回失败.#示例脚本:
  4. [root@gjy ~/shell]# cat read3.sh
  5. #!/bin/bash
  6. #1.提示用户输入一个IP地址
  7. read -p "请输入需要检测的IP地址: " IP
  8. #2.使用ping命令检测IP地址是否通讯
  9. ping -W1 -c1 $IP &>/dev/null
  10. rc=$?
  11. #3.检查上一次命令执行返回的状态码是否正常
  12. if [ $rc -eq 0 ];then
  13. echo "$IP 能正常通信"
  14. else
  15. echo "$IP 无法正常通信"
  16. fi
  17. #执行脚本
  18. [root@gjy ~/shell]# sh read3.sh
  19. 请输入需要检测的IP地址: 223.5.5.5
  20. 223.5.5.5 能正常通信
  21. [root@gjy ~/shell]# sh read3.sh
  22. 请输入需要检测的IP地址: 233.5.5.5
  23. 233.5.5.5 无法正常通信
  24. #echo命令输出颜色。echo -e "\033[30m 黑色字 \033[0m"
  25. echo -e "\033[31m 红色字 \033[0m"
  26. echo -e "\033[32m 绿色字 \033[0m"
  27. echo -e "\033[33m 黄色字 \033[0m"
  28. echo -e "\033[34m 蓝色字 \033[0m"
  29. echo -e "\033[35m 紫色字 \033[0m"
  30. echo -e "\033[36m 天蓝字 \033[0m"
  31. echo -e "\033[37m 白色字 \033[0m"
  32. [root@gjy ~/shell]# cat read3.sh
  33. #!/bin/bash
  34. #1.提示用户输入一个IP地址
  35. read -p "请输入需要检测的IP地址: " IP
  36. #2.使用ping命令检测IP地址是否通讯
  37. ping -W1 -c1 $IP &>/dev/null
  38. rc=$?
  39. #3.检查上一次命令执行返回的状态码是否正常
  40. if [ $rc -eq 0 ];then
  41. echo -e "\033[32m $IP 能正常通信 \033[0m"
  42. else
  43. echo -e "\033[31m $IP 无法正常通信 \033[0m"
  44. fi
  45. [root@gjy ~/shell]# sh read3.sh
  46. 请输入需要检测的IP地址: 223.5.5.5
  47. 223.5.5.5 能正常通信
  48. [root@gjy ~/shell]# sh read3.sh
  49. 请输入需要检测的IP地址: 233.5.5.5
  50. 233.5.5.5 无法正常通信

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

  1. 1)提示用户输入主机名称.
  2. 2)询问用户是否确此操作.
  3. 3)真的执行.#示例脚本
  4. [root@gjy ~/shell]# cat read4.sh
  5. #!/bin/bash
  6. #1.提示用户输入新的主机名称,然后打印新的主机名称
  7. read -p "请输入你想修改的主机名称: " HostName
  8. echo "你将要修改的主机名称为: $HostName"
  9. #2.是否确认修改,如果确认则真的执行shell命令,如果不确认则退出
  10. read -p "你确定真的要修改如下内容吗[Y|N]? " readly
  11. #3.判断用户输入的是Y还是N,如果是Y则真的执行,如果是其他则退出
  12. if [ $readly == "Y" ];then
  13. hostnamectl set-hostname $HostName && bash
  14. else
  15. exit
  16. fi
  17. #执行脚本
  18. [root@gjy ~/shell]# sh read4.sh
  19. 请输入你想修改的主机名称: web
  20. 你将要修改的主机名称为: web
  21. 你确定真的要修改如下内容吗[Y|N]? N
  22. [root@gjy ~/shell]# sh read4.sh
  23. 请输入你想修改的主机名称: web
  24. 你将要修改的主机名称为: web
  25. 你确定真的要修改如下内容吗[Y|N]? Y

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

  1. 1)提示用户输入新的ip地址主机位.
  2. 2)询问用户是否确此操作.
  3. 3)真的执行.#示例脚本:
  4. [root@gjy ~/shell]# cat read5.sh
  5. #!/bin/bash
  6. #1.提示用户输入新的ip地址主机位,然后打印新的ip地址主机位
  7. read -p "请输入你想修改的新的ip地址主机位: " IP
  8. echo "你将要修改的新的ip地址主机位为: $IP"
  9. #2.是否确认修改,如果确认则真的执行shell命令,如果不确认则退出
  10. read -p "你确定真的要修改如下内容吗[Y|N]? " readly
  11. #3.判断用户输入的是Y还是N,如果是Y则真的执行,如果是其他则退出
  12. if [ $readly == "Y" ];then
  13. oldip=`ifconfig eth0 |awk -F '[ .]+' 'NR==2{print $6}'`
  14. sed -i "s#${oldip}#${IP}#g" /etc/sysconfig/network-scripts/ifcfg-eth[01] && \
  15. systemctl restart network
  16. else
  17. exit
  18. fi
  19. #执行脚本
  20. [root@gjy ~/shell]# sh read5.sh
  21. 请输入你想修改的新的ip地址主机位: 90
  22. 你将要修改的新的ip地址主机位为: 90
  23. 你确定真的要修改如下内容吗[Y|N]? Y
  24. #卡住,重新连接新的IP地址进行连接登录。

3. Shell变量替换

变量说明

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

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

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

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

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

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

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

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

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

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

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

  1. [root@gjy ~]# url=www.sina.com.cn #定义变量
  2. [root@gjy ~]# echo ${url} #输出变量结果
  3. www.sina.com.cn
  4. [root@gjy ~]# echo ${url%.*} #从后往前,最短匹配
  5. www.sina.com
  6. [root@gjy ~]# echo ${url%%.*} #从后往前,最长匹配
  7. 贪婪匹配
  8. www

03. 变量内容替换

  1. [root@gjy shell01]# echo ${url}
  2. www.sina.com.cn
  3. [root@gjy shell01]# echo ${url/n/N}
  4. www.siNa.com.cn
  5. [root@gjy shell01]# echo ${url//n/N}
  6. www.siNa.com.cN

04. 索引及切片

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

案例,查询长度

  1. [root@web01 ~]# echo $name
  2. I am gjy
  3. [root@web01 ~]# echo $name|awk '{print length}'
  4. 8
  5. [root@web01 ~]# expr length "$name"
  6. 8
  7. [root@web01 ~]# echo ${#name}
  8. 8

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

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

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

  1. 01)备份什么?
  2. 02)备份到哪?
  3. 03)使用什么方式?
  4. 04)备份的周期? #脚本如下:
  5. [root@gjy ~/shell]# cat fileback.sh
  6. #!/usr/bin/bash
  7. DestPath=/root/bak
  8. Date=$(date +%F)
  9. #1.准备目标位置
  10. [ ! -d $DestPath ] && mkdir -p $DestPath
  11. #2.备份到目标位置
  12. tar czf $DestPath/${Date}_etc.tar.gz /etc
  13. [root@gjy ~/shell]# sh fileback.sh#执行脚本:
  14. [root@gjy ~/shell]# sh fileback.sh
  15. tar: Removing leading `/' from member names#查看结果
  16. [root@gjy ~/shell]# ll /root/bak/2019-06-25_etc.tar.gz
  17. -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. 1)批量修改txttxt.bak
  2. 2)把所有的.bak文件打包压缩为123.tar.gz
  3. 3)批量还原文件的名字,及把增加的.bak再删除
  4. 方法一:
  5. [root@gjy ~/shell]# cat mv.sh
  6. #!/usr/bin/bash
  7. dir=/backup
  8. #1.判断目录是否存在,不存在则创建
  9. if [ -d $dir ];then
  10. echo " $dir已存在"
  11. else
  12. echo " $dir不存在,现在创建" && mkdir -p $dir
  13. fi
  14. #创建10个文件
  15. touch $dir/{1..10}.txt
  16. #2.批量修改名称
  17. find $dir -type f -name "*.txt" > $dir/txt.log
  18. sed -r 's#(.*)#mv \1 \1.bak#g' $dir/txt.log |bash
  19. #3.打包压缩
  20. tar czf $dir/123.tar.gz $dir/*.bak
  21. #4.还原
  22. find $dir -type f -name "*.bak" > $dir/bak.log
  23. sed -r 's#(.*).bak#mv \1.bak \1#g' $dir/bak.log|bash
  24. 方法二:
  25. [root@gjy ~/shell]# cat rename.sh
  26. #!/bin/bash
  27. #定义变量T=txt
  28. B=bak
  29. #把backup目录下.txt结尾的文件修改成txt.bak
  30. cd /backup && rename $T $T\.$B *.txt
  31. #把所有的.bak结尾的文件打包压缩为123.tar.gz
  32. tar zcvf /backup/123.tar.gz /backup/*.bak
  33. #还原文件的名字rename $T\.$B $T
  34. *方法三:
  35. [root@gjy ~/shell]# cat for_name.sh
  36. #!/bin/bash
  37. dir=/backup
  38. #1.判断目录是否存在,不存在则创建
  39. [ -d $dir ] || mkdir -p $dir
  40. #创建10个文件
  41. touch $dir/{1..10}.txt
  42. #批量修改文件名
  43. find $dir -type f -name "*.txt" >$dir/txt.log
  44. #2.使用for循环进行修改名
  45. for i in $(cat $dir/txt.log)
  46. do
  47. mv $i $i.bak
  48. done
  49. #3.打包压缩
  50. tar czf $dir/123.tar.gz $dir/*.bak
  51. #4.批量还原
  52. find $dir -type f -name "*.bak" > $dir/bak.log
  53. for j in $(cat $dir/bak.log)
  54. do
  55. mv $j ${j%.*}
  56. done

4. Shell变量运算

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

操作符含义

num1 + num2 求加

num1 - num2 求减

num1 * num2 求积

num1 / num2 求商

num1 % num2 求余

  1. #定义变量,使用expr、$(())、$[]、let进行加减乘除。expr必须空格隔开。
  2. #expr
  3. [root@gjy ~/shell]# num1=20
  4. [root@gjy ~/shell]# num2=10
  5. [root@gjy ~/shell]# expr $num1 + $num2
  6. 30
  7. [root@gjy ~/shell]# expr $num1 - $num2
  8. 10
  9. [root@gjy ~/shell]# expr $num1 * $num2
  10. expr: syntax error
  11. [root@gjy ~/shell]# expr $num1 \* $num2
  12. 200
  13. [root@gjy ~/shell]# expr $num1 / $num2
  14. 2
  15. [root@gjy ~/shell]# expr $num1 % $num2
  16. 0
  17. #$(())
  18. [root@gjy ~/shell]# echo $(( $num1 + $num2 ))
  19. 30
  20. [root@gjy ~/shell]# echo $(( $num1 - $num2 ))
  21. 10
  22. [root@gjy ~/shell]# echo $(( $num1 * $num2 ))
  23. 200
  24. [root@gjy ~/shell]# echo $(( $num1 / $num2 ))
  25. 2
  26. [root@gjy ~/shell]# echo $(( $num1 % $num2 ))
  27. 0
  28. #$[]
  29. [root@gjy ~/shell]# echo $[ $num1 + $num2 ]
  30. 30
  31. [root@gjy ~/shell]# echo $[ $num1 - $num2 ]
  32. 10
  33. [root@gjy ~/shell]# echo $[ $num1 * $num2 ]
  34. 200
  35. [root@gjy ~/shell]# echo $[ $num1 / $num2 ]
  36. 2
  37. [root@gjy ~/shell]# echo $[ $num1 % $num2 ]
  38. 0
  39. #let
  40. [root@gjy /scripts]# a=1
  41. [root@gjy /scripts]# let a++
  42. [root@gjy /scripts]# echo $a
  43. 2
  44. [root@gjy /scripts]# let a++
  45. [root@gjy /scripts]# echo $a
  46. 3
  47. [root@gjy /scripts]# let a--
  48. [root@gjy /scripts]# echo $a
  49. 2

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

  1. #需要下载此命令
  2. [root@gjy ~/shell]# yum install bc -y
  3. [root@gjy ~/shell]# num1=10
  4. [root@gjy ~/shell]# num2=20
  5. [root@gjy ~/shell]# echo $num1+$num2 |bc
  6. 30
  7. [root@gjy ~/shell]# echo $num1-$num2 |bc
  8. -10
  9. [root@gjy ~/shell]# echo $num1*$num2 |bc
  10. 200
  11. [root@gjy ~/shell]# echo $num1/$num2 |bc
  12. 0
  13. [root@gjy ~/shell]# echo "scale=2;$num1/$num2" |bc
  14. .50
  15. [root@gjy ~/shell]# echo $num1^$num2 |bc
  16. 100000000000000000000
  17. [root@gjy ~/shell]# echo $num1%$num2 |bc
  18. 10
  19. #awk
  20. [root@gjy ~/shell]# awk "BEGIN{print $num1 + $num2 }"
  21. 30
  22. [root@gjy ~/shell]# awk "BEGIN{print $num1 / $num2 }"
  23. 0.5
  24. [root@gjy ~/shell]# awk "BEGIN{print $num1 - $num2 }"
  25. -10
  26. [root@gjy ~/shell]# awk "BEGIN{print $num1 * $num2 }"
  27. 200
  28. [root@gjy ~/shell]# awk "BEGIN{print $num1 / $num2 }"
  29. 0.5
  30. #指定小数位
  31. [root@gjy ~/shell]# awk 'BEGIN{printf "%.2f\n",1/2}'
  32. 0.50
  33. [root@gjy ~/shell]# awk "BEGIN{print $num1 ^ $num2 }"
  34. 100000000000000000000
  35. [root@gjy ~/shell]# awk "BEGIN{print $num1 % $num2 }"
  36. 10
  37. #Python
  38. [root@gjy ~/shell]# echo "print $num1+$num2" |python
  39. 30
  40. [root@gjy ~/shell]# echo "print $num1-$num2" |python
  41. -10
  42. [root@gjy ~/shell]# echo "print $num1*$num2" |python
  43. 200
  44. [root@gjy ~/shell]# echo "print $num1/$num2" |python
  45. 0
  46. [root@gjy ~/shell]# echo "print ${num1}.0/$num2" |python
  47. 0.5
  48. [root@gjy ~/shell]# echo "print $num1%$num2" |python
  49. 10
  50. **03. 变量运算案例**
  51. 案例1: 求ps axu中的VSZ列的和
  52. [root@web02 shell]# ps aux |awk 'NR>=2 {print $5}'|awk '{sum+=$1}END {print sum}'
  53. 17039904
  54. [root@web02 shell]# ps aux |awk 'NR>=2 {print $5}'|tr "\n" "+" |sed -r 's#(.*)\+#\1\n#g'|bc
  55. 16849512
  56. [root@web02 shell]# ps aux |awk 'NR>=2 {print $5}'|awk '{i+=$1}END{print i}'
  57. 17084196

03. 变量运算案例

  1. 案例2:做一个加减乘除的计算器例如:
  2. 请输入第一个数字 10
  3. 请输入第二个数字 20
  4. 显示的结果 10+20=30[root@gjy ~/shell]# cat count.sh
  5. #!/bin/bash
  6. read -p "请输入第一个数字: " num1
  7. read -p "请输入第二个数字: " num2
  8. echo "$num1+$num2=$[$num1+$num2]"
  9. echo "$num1-$num2=$[$num1-$num2]"
  10. echo "$num1*$num2=$[$num1*$num2]"
  11. echo "$num1/$num2=$[$num1/$num2]"

5. Shell变量案例

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

  1. #示例脚本如下:[root@gjy ~/shell]# sh status.sh
  2. #!/usr/bin/bash
  3. System=$(hostnamectl |grep System|awk '{print $3,$4,$5}')
  4. Kernel=$(hostnamectl|grep Kernel|awk -F: '{print $2}')
  5. Vt=$(hostnamectl|grep Virtualization|awk '{print $2}')
  6. Statichostname=$(hostnamectl|grep "Static hostname"|awk '{print $3}')
  7. Eth0=$(ifconfig eth0|awk 'NR==2{print $2}')
  8. Lo=$(ifconfig lo|awk 'NR==2{print $2}')
  9. Network_T=$(curl -s icanhazip.com)
  10. echo "当前系统版本是: $System"
  11. echo "当前系统内核是: $Kernel"
  12. echo "当前虚拟平台是: $Vt"
  13. echo "当前静态主机名是: $Statichostname"
  14. echo "当前Eth0IP地址是: $Eth0"
  15. echo "当前lo地址是: $Lo"
  16. echo "当前外网地址是: $Network_T"
  17. #执行脚本
  18. [root@gjy ~/shell]# sh status.sh
  19. 当前系统版本是: CentOS Linux 7
  20. 当前系统内核是: Linux 3.10.0-957.el7.x86_64
  21. 当前虚拟平台是: vmware
  22. 当前静态主机名是: gjy
  23. 当前Eth0IP地址是: 10.0.0.90
  24. 当前lo地址是: 127.0.0.1
  25. 当前外网地址是: 139.226.173.12

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

  1. #需求
  2. 1)打印string长度
  3. 2)删除字符串中所有的Hadoop
  4. 3)替换第一个HadoopLinux
  5. 4)替换全部HadoopLinux
  6. 用户请输入数字1|2|3|4,可以执行对应项的功能。
  7. #脚本如下:
  8. [root@gjy ~/shell]# cat variable.sh
  9. #!/usr/bin/bash
  10. string="Bigdata process is Hadoop, Hadoop is open source project"
  11. echo $string
  12. cat <<EOF
  13. 1)、打印string长度
  14. 2)、删除字符串中所有的Hadoop
  15. 3)、替换第一个HadoopLinux
  16. 4)、替换全部HadoopLinux
  17. EOF
  18. read -p "请输入数字1|2|3|4: " var
  19. if [ $var -eq 1 ];then
  20. echo 当前string变量的长度是: ${#string}
  21. #echo 当前string变量的长度是: echo ${string}|wc -L
  22. fi
  23. if [ $var -eq 2 ];then
  24. echo ${string//Hadoop/}
  25. fi
  26. if [ $var -eq 3 ];then
  27. echo ${string/Hadoop/Linux}
  28. fi
  29. if [ $var -eq 4 ];then
  30. echo ${string//Hadoop/Linux}
  31. fi
  32. #执行脚本
  33. [root@gjy ~/shell]# sh variable.sh
  34. Bigdata process is Hadoop, Hadoop is open source project
  35. 1)、打印string长度
  36. 2)、删除字符串中所有的Hadoop
  37. 3)、替换第一个HadoopLinux
  38. 4)、替换全部HadoopLinux
  39. 请输入数字1|2|3|4,或q|Q: 1
  40. 当前string变量的长度是: 57
  41. [root@gjy ~/shell]# sh variable.sh
  42. Bigdata process is Hadoop, Hadoop is open source project
  43. 1)、打印string长度
  44. 2)、删除字符串中所有的Hadoop
  45. 3)、替换第一个HadoopLinux
  46. 4)、替换全部HadoopLinux
  47. 请输入数字1|2|3|4,或q|Q: 2
  48. Bigdata process is , is open source project
  49. [root@gjy ~/shell]# sh variable.sh
  50. Bigdata process is Hadoop, Hadoop is open source project
  51. 1)、打印string长度
  52. 2)、删除字符串中所有的Hadoop
  53. 3)、替换第一个HadoopLinux
  54. 4)、替换全部HadoopLinux
  55. 请输入数字1|2|3|4,或q|Q: 3
  56. Bigdata process is Linux, Hadoop is open source project
  57. [root@gjy ~/shell]# sh variable.sh
  58. Bigdata process is Hadoop, Hadoop is open source project
  59. 1)、打印string长度
  60. 2)、删除字符串中所有的Hadoop
  61. 3)、替换第一个HadoopLinux
  62. 4)、替换全部HadoopLinux
  63. 请输入数字1|2|3|4,或q|Q: 4
  64. Bigdata process is Linux, Linux is open source project

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

  1. [root@web02 backup]# cat bbb.sh
  2. #!/bin/bash
  3. abc="I am qiuzengjia teacher I am 18"
  4. echo $abc
  5. for i in $abc
  6. do
  7. if [ ${#i} -lt 3 ];then
  8. echo "长度小于3:$i"
  9. else
  10. echo "长度大于或等于3: $i"
  11. fi
  12. done
  13. [root@web02 backup]# sh bbb.sh
  14. I am qiuzengjia teacher I am 18
  15. 长度小于3I
  16. 长度小于3am
  17. 长度大于或等于3: qiuzengjia
  18. 长度大于或等于3: teacher
  19. 长度小于3I
  20. 长度小于3am
  21. 长度小于318

命令行查询

  1. [root@web01 ~]# echo $name
  2. I am gjy
  3. [root@web01 ~]# echo $name |xargs -n1
  4. I
  5. am
  6. gjy
  7. [root@web01 ~]# echo $name |xargs -n2
  8. I am
  9. gjy
  10. #查询长度
  11. [root@web01 ~]# echo $name |xargs -n1|awk '{print length}'
  12. 1
  13. 2
  14. 3
  15. #判断长度小于3
  16. 方法一:
  17. [root@web01 ~]# echo $name |xargs -n1|awk '{if(length<3)print}'
  18. I
  19. am
  20. 方法二
  21. [root@web01 ~]# echo $name |awk '{for (i=1;i<=NF;i++)if(length($i)<3)print $i}'
  22. I
  23. am

Shell02---变量的更多相关文章

  1. 6 小时 Python 入门

    6 小时 Python 入门 以下操作均在 Windows 环境下进行操作,先说明一下哈 一.安装 Python 1.官网下载 Python 进入官网(https://www.python.org), ...

  2. In-Memory:在内存中创建临时表和表变量

    在Disk-Base数据库中,由于临时表和表变量的数据存储在tempdb中,如果系统频繁地创建和更新临时表和表变量,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL ...

  3. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  4. Shell特殊变量

    $ 表示当前Shell进程的ID,即pid $echo $$ 运行结果 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数 ...

  5. Java多线程基础——对象及变量并发访问

    在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...

  6. Js 变量声明提升和函数声明提升

    Js代码分为两个阶段:编译阶段和执行阶段 Js代码的编译阶段会找到所有的声明,并用合适的作用域将它们关联起来,这是词法作用域的核心内容 包括变量声明(var a)和函数声明(function a(){ ...

  7. PHP源码分析-变量

    1. 变量的三要素变量名称,变量类型,变量值 那么在PHP用户态下变量类型都有哪些,如下: // Zend/zend.h #define IS_NULL 0 #define IS_LONG 1 #de ...

  8. JavaScript var关键字、变量的状态、异常处理、命名规范等介绍

    本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...

  9. shell变量

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

  10. 引人瞩目的 CSS 变量(CSS Variable)

    这是一个令人激动的革新. CSS 变量,顾名思义,也就是由网页的作者或用户定义的实体,用来指定文档中的特定变量. 更准确的说法,应该称之为 CSS 自定义属性 ,不过下文为了好理解都称之为 CSS 变 ...

随机推荐

  1. BZOJ-2337 XOR和路径(HNOI2011)概率DP+概率的线性叠加

    题意:给出n个点和m条边,每条边有权值wi,从1出发,每次等概率选一条出边走,直到终点n停止,得到的值是路径所有边的异或和.问异或和期望. 解法:这道题非常有意思!首先比较直观的想法就是dp[x]代表 ...

  2. 线程安全与非线程安全集合说一下,底层怎么实现的(hashmap,concurrenthashmap)

    Hashmap本质是数组加链表.根据key取得hash值,然后计算出数组下标,如果多个key对应到同一个下标,就用链表串起来,新插入的在前面. ConcurrentHashMap:在hashMap的基 ...

  3. OpenCV图像数据字节对齐

    目录 1. IplImage的data字段,是char*类型,是4字节对齐. 2. 手动创建的Mat通常是没有字节对齐的 3. 从IplImage转过来的Mat,是字节对齐的 4. 总结 图像数据是否 ...

  4. vue代理配置之二--dev方式启动的index.js配置

    'use strict' // Template version: 1.3.1 // see http://vuejs-templates.github.io/webpack for document ...

  5. Python 把字符串变成浮点数

    from functools import reducedi = {}di.update(zip('1234567890.', [1,2,3,4,5,6,7,8,9,0,'.'])) def str2 ...

  6. MySQL不支持的特性

    MySQL 1.不支持物化视图. 2.不支持位图索引. 3.不支持并行查询. 4.不支持哈希关联,MySQL的所有关联都是嵌套循环关联.不过,可以通过建立一个哈希索引来曲线实现. 5.不允许对同一表同 ...

  7. http 请求包含哪几个部分(请求行、请求头、请求体)

    http协议报文     1.请求报文(请求行/请求头/请求数据/空行)         请求行             求方法字段.URL字段和HTTP协议版本             例如:GET ...

  8. AcWing 252. 树 (点分治)打卡

    题目:https://www.acwing.com/problem/content/254/ 题意:求一棵树上,路径<=k的有多少条 思路:点分治,我们用两个指针算solve函数,首先对算出来的 ...

  9. wxparse使用(富文本插件)

    优点:目前已知唯一可以转化HTML到小程序识别的插件 缺点:转换一个HTML标签可能需要大量的微信小程序标签还有样式 配置:第一步,下载 https://github.com/icindy/wxPar ...

  10. 120、TensorFlow创建计算图(二)

    #创建一个计算流图 #大多数tensorflow程序开始于dataflow graph 的构造函数 #在这个命令中你执行了tensorflow api的函数 #创建了新的操作tf.Operation ...