• Linux Shell编程--变量


    前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除

    变量: bash作为程序设计语言和其它高级语言一样也提供使用和定义变量的功能

    预定义变量、环境变量、自定义变量、位置变量

    一、自定义变量

    1、定义

    在 Bash 中,定义变量非常简单,不像其他高级编程语言(如 C/C++、Java 等)那么复杂。在定义一个新变量时,一般不需要提前声明,只需直接指定变量名称并赋值即可

     变量名称=
    • 变量名称:只能由字母,数字,下划线组成,不能以数字开头; 注意:应该让变量名称有意义;
    • =赋值符号 前后不能有空格
    • :所有的字符串和数字都可以;

    2、查看和引用变量的值

    引用变量: $变量名${变量名}

    当变量名称容易和紧跟其后的其他字符相混淆时,需要添加大括号 {} 将其括起来,否则将无法确定正确的变量名称。对于未定义的变量,将显示为空值

    1.  [root@centos ~]# a=100
    2.  [root@centos ~]# echo $a
    3.  100
    4.  [root@centos ~]# echo $aa
    5.  # 这里输出为空,因为解释器认为$aa是变量,使用大括号扩起:
    6.  [root@centos ~]# echo ${a}a
    7.  100a

    查看变量:echo $变量名 set(所有变量:包括自定义变量和环境变量

    取消变量:unset 变量名 仅在当前shell中有效

    作用范围:仅在当前shell中生效

    3、echo选项

    1.  echo -n # 表示不换行输出
    2.  echo -o # 输出转义字符,将转义后的内容输出到屏幕上

    常用的转义字符:

    1.  \c # 不换行输出
    2.  \n # 换行
    3.  \t # 插入tab,即制表符

    4、取消定义

    使用unset命令可取消变量的定义

    二、特殊变量

    特殊变量含义
    $0脚本的文件名
    $1,$2,...脚本的第n个参数
    $#脚本参数的个数
    $?最后一个命令的退出状态码
    $$当前 Shell 进程的 PID
    $USER当前用户的用户名
    $HOME当前用户的主目录
    $*获取所有参数,并将每个参数作为单独字符返回
    $@将所有参数包括空白符一起作为一个字符返
    1.  [root@centos ~]# ls
    2.  anaconda-ks.cfg Desktop Documents Downloads initial-setup-ks.cfg Music Pictures Public Templates Videos
    3.  [root@centos ~]# echo $?
    4.  0
    5.  ​
    6.  [root@centos ~]# vim variable.sh
    7.  #!/bin/bash
    8.  echo "The current process is $$"
    9.  #输出当前进程的PID
    10.  #这个PID就是variable.sh脚本执行时生成的进程的PID
    11.  ​
    12.  [root@centos ~]# sleep 3000 & # 符号"&"的意思是把命令放入后台执行
    13.  [1] 52547
    14.  [root@centos ~]# echo $!
    15.  52547

    三、环境变量

    shell在开始执行时已经定义好的

    1.  env 查看所有环境变量
    2.  set 查看所有变量

    环境变量拥有可继承性:export之后就拥有继承性

     export 导出变量(作用范围) 

    临时生效 :

    1.  [root@newrain ~]# IPADDR=192.168.1.1
    2.  [root@newrain ~]# echo $IPADDR
    3.  192.168.1.1

    永久生效 :

    写到4个登陆脚本中 ~/.bashrc ~/profile 更好放在/etc/profile.d/* 下建立独立的环境

    变量配置文件:

    常用环境变量:USER UID HOME HOSTNAME PWD PS1 PATH

    PATH:存储所有命令所在的路径

    四、变量运算

    1、基本运算

    算式运算符: +、-、*、/、()、%取余(取模)

    运算方式$(()) $[] expr

    1.  # $(())方式:
    2.  [root@centos ~]# echo $(( 5+2-(3*2)/5 ))
    3.  6
    4.  # $[]方式:
    5.  [root@centos ~]# echo $[ 5+2 - (3*2)/5 ]
    6.  6
    7.  # expr方式:运算符号两边的空格必须写;不能做浮点运算
    8.  [root@centos ~]# expr 5 + 3
    9.  8
    10.  [root@centos ~]# expr 5+3
    11.  5+3
    12.  [root@centos ~]# expr 5 + 3.0
    13.  expr: non-integer argument

    2、乘法运算

    1.  [root@centos ~]# expr 5 \* 8
    2.  40
    3.  [root@centos ~]# expr 5 '*' 8
    4.  40

    2、随机数

    为什么取余时需要+1是因为在取余时如果被整除那么余数会是0,这样就不在限定范围内了

    1.  # 取1-6之间的随机数
    2.  echo $(( RANDOM % 6 + 1 ))
    3.  ​
    4.  # 随机生成从1~50之间的数
    5.  echo $(($RANDOM%50+1))

    3、浮点运算:

    bash本身不能做小数计算:需要bc命令转换

    bc 是一种用于数学计算的命令行工具,在大多数 Linux 和 Unix 系统中都是默认安装的。它支持高精度的小数运算,可以用于 Shell 脚本中进行小数运算

    1.  # 计算2乘以4
    2.  [root@centos ~]# echo "2*4.1" | bc
    3.  8.2
    4.  # 计算2的4次方
    5.  [root@centos ~]# echo "2^4" | bc
    6.  16
    7.  # 计算6除以4的结果,并且结果保留两位小数; scale:精度
    8.  [root@centos ~]# echo "scale=2;6/4" | bc
    9.  1.50

    示例:

    1.  # 计算我的信用卡一年的利息,假设我欠10000块钱
    2.  # cat rent.sh
    3.  #!/bin/bash
    4.  m=$( echo 5/10000|bc -l) # -l:定义使用的标准数学库
    5.  # m=`echo 5/10000|bc -l`
    6.  # 因为shell不支持小数,所以要用bc转换一下
    7.  sum=10000
    8.  for i in {1..365}
    9.  do
    10.   sum=$(echo $sum+$sum*$m | bc )
    11.   echo $sum
    12.  done
    13.  echo $sum
    14.  ​
    15.  # 简单例子:
    16.  #!/bin/bash sum=1
    17.  for i in {1..20}
    18.  do
    19.  sum=$(echo $sum+1|bc)
    20.  echo $sum
    21.  done

    五、转义、单引号、双引号、单反引号

    当一个字符被引用时,其特殊含义被禁止;使用转义把有意义的变的没意义,把没意义的变的有意义,比如\n\t

    1.  [root@centos ~]# echo -e '5\\n6\n7'
    2.  5\n6
    3.  7

    完全引用'' //强引 硬引

    部分引用"" //弱引 软引

    单反引号``: 在 Shell 脚本中用于执行命令,并将命令的输出结果作为字符串返回

    1.  [root@centos ~]# num=1
    2.  [root@centos ~]# echo 高三1班有$num个女生
    3.  高三1班有1个女生
    4.  [root@centos ~]# echo "高三1班有$num个女生"
    5.  高三1班有1个女生
    6.  [root@centos ~]# echo '高三1班有$num个女生'
    7.  高三1班有$num个女生
    8.  [root@centos ~]# current_date=`date`
    9.  [root@centos ~]# echo "Current date and time: $current_date"
    10.  Current date and time: Thu Aug  1 11:35:43 CST 2024

    六、read读取用户标准输入

    1、read命令

    read:功能就是读取键盘输入的值,并赋给变量

    语法:read [-options] [variable_name] ,其常用参数如下:

    常用选项含义
    -p prompt显示提示符,提示用户输入
    -a array将输入的数据按照空格分割存储到数组中。
    -d delimiter指定输入的结束符。
    -r取消对反斜杠的特殊处理(默认情况下,反斜杠用于转义特殊字符)。
    -n num_chars指定读取的字符数。
    -s静默模式,用户输入不会显示在屏幕上。
    -t timeout设置超时时间,在超时后 read 命令会自动退出。

    2、基本用法

    1.  # read -t 5 var
    2.  # echo var
    3.  5
    4.  # read -p "提示信息:" var
    5.  提示信息dsfd
    6.  # echo var
    7.  dsfd

    read后面的变量var可以只有一个,也可以有多个,这时如果输入多个数据,则第一个数据给第一个变量,第二个数据给第二个变量,如果输入数据个数过多,则最后所有的值都给最后一个变量

     read -p "后面的内容为提示信息,需要打印出来" -s '后面的内容是加密信息,不要输出' -t 超时时间 

    下面示例几个简单的例子:

    1.  [root@centos ~]# cat read.sh
    2.  #!/bin/bash
    3.  read first second third
    4.  echo "the first parameter is $first"
    5.  echo "the second parameter is $second"
    6.  echo "the third parameter is $third"
    7.  [root@centos ~]# bash read.sh
    8.  one two three
    9.  the first parameter is one
    10.  the second parameter is two
    11.  the third parameter is three
    12.  [root@centos ~]# cat test.sh
    13.  # read test
    14.  read -p "请输入你的银行卡帐号" num
    15.  read -p "请在五秒内输入密码" -t 5 pass
    16.  echo "你的密码错误!"
    17.  echo $num |mail -s "card num" root
    18.  echo $pass|mail -s "card pass" root
    19.  # 自定义程序结果的正确
    20.  [root@centos ~]# cat test1.sh
    21.  #!/bin/bash
    22.  read -p "Do you want to continue [Y/N]? " answer
    23.  case $answer in
    24.  Y|y)
    25.  echo "fine ,continue";;
    26.  N|n)
    27.  echo "ok,good bye";;
    28.  *)
    29.  echo "error choice";;
    30.  esac
    31.  exit 0

    七、其他技巧

    1、取消屏幕回显

    1.  # stty -echo
    2.  # stty echo

    2、变量长度

    1.  # a=123
    2.  # echo ${#a}
    3.  3

    3、变量嵌套(扩展)

    表示(变量)$var的长度

    1.  # eval 执行字符串内的可执行命令
    2.  [root@newrain ~]# name='kobe'
    3.  [root@newrain ~]# kobe=24
    4.  [root@newrain ~]# eval echo '$'"${name}"
    5.  24
    6.  # 先获取name的值,通过再次构造echo命令,使用eval再一次执行语句,就达到我们的目的

    简单实例:

    1.  [root@newrain shell]# cat d.sh
    2.  #!/bin/bash
    3.  echo 1.配置yum客户端
    4.  echo 2.添加A记录
    5.  echo 3.一键安装lamp环境
    6.  echo 4.一键配置静态IP
    7.  read -p "请选择你想使用的功能(1/2/3/4):" num
    8.  con_ip(){
    9.  echo 这是配置IP地址的小工具
    10.  }
    11.  case $num in
    12.   1):
    13.   ;;
    14.   2):
    15.   ;;
    16.   3):
    17.   ;;
    18.   4)con_ip
    19.   ;;
    20.   *):
    21.   ;;
    22.  esac

    八、练习

    1、练习1

    编写一个shell脚本,用于搜集其执行主机的信息,打印结果如下:

    1.  [root@centos ~]# ./test.sh
    2.  20120524日 星期四 17:07:45 CST
    3.  当前的用户为 root
    4.  当前用户的宿主目录为 /root 用户的标识为 0
    5.  主机名称为 newrain
    6.  网卡的IP地址为 192.168.1.106

    解题:

    1.  [root@centos ~]# vim ./test.sh
    2.  #!/usr/bin/bash
    3.  # 获取主机信息
    4.  time=`date +%y年%m月%d日-%H:%M`
    5.  ip=`ifconfig ens33 | grep netmask | awk '{print $2}'`
    6.  echo "现在的时间是:" $time
    7.  echo "当前的用户是:" $USER
    8.  echo "当前的用户标识是:" $UID
    9.  echo "当前的主机名称是:" $HOSTNAME
    10.  echo "当前可用网卡IP是:" $ip
    11.  [root@centos ~]# bash test.sh
    12.  现在的时间是: 240801-00:47
    13.  当前的用户是: root
    14.  当前的用户标识是: 0
    15.  当前的主机名称是: localhost.localdomain
    16.  当前可用网卡IP是: 10.0.0.2

    取根分区剩余空间:

    1.  # NR==2表示取第二行
    2.  [root@centos ~]# df -h /dev/sda2 |awk 'NR==2{print $4}'
    3.  1.9G

    取当前系统剩余内存

    1.  [root@centos ~]# echo "现在的剩余内存是:"`free -m |awk 'NR==2{print $4}'`
    2.  现在的剩余内存是:1154

    取当前系统剩余内存

    1.  # /-d指定分隔符,-f指定显示区域,3-第三列以后(包括第三列)
    2.  [root@centos ~]# echo 现在cpu的`uptime |cut -d, -f3-`
    3.  现在cpu的 load average: 0.00, 0.01, 0.05
    4.  ​
    5.  [root@centos ~]# echo 现在cpu的`uptime |awk -F"," '{print $4,$5,$6}'`
    6.  现在cpu的 0.01 0.05

    2、练习2

    编写一个脚本实现显示时间和日期, 列出所有登录系统的用户,并且给出系统的当前时间以及已经运行多长时间.最后脚本还会将这些信息写入一个日志文件

    1.  [root@centos ~]# vim information.sh
    2.  #!/bin/bash
    3.  centime=`date`
    4.  nowtime=`uptime | awk '{print $1}'`
    5.  username=`w -h | awk '{print $1}'|sort|uniq -c|awk '{print $2}'`
    6.  time=`uptime | awk '{print $3,$4,$5}'`
    7.  cat >>file1.txt <
    8.  echo "时间:$centime"
    9.  echo "系统的当前时间是: $nowtime"
    10.  echo "系统已运行的时长: $time"
    11.  echo "系统登录的用户有: $username"
    12.  EOF
    13.  ​
    14.  [root@centos ~]# touch file1.txt
    15.  [root@centos ~]# bash information.sh
    16.  [root@centos ~]# cat file1.txt
    17.  echo "时间:Thu Aug 1 01:07:05 CST 2024"
    18.  echo "系统的当前时间是: 01:07:05"
    19.  echo "系统已运行的时长: 2:25, 2 users,"
    20.  echo "系统登录的用户有: root"

    致谢

    在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。 

    学习永无止境,让我们共同进步!!

  • 相关阅读:
    SQL Server实战四:查询数据库的数据
    前端基础入门之JS BOM简介
    JDBC-day05(DAO及相关实现类)
    【vue2第十二章】ref和$refs获取dom元素 和 vue异步更新与$nextTick使用
    【Bio】基础生物学 - 蛋白质 protein
    机器人算法—ROS TF坐标变换
    Unity中Shader的PBR的基础知识与理论
    A_A03_002 51(STC)单片机程序串口烧录
    H5 uniapp 在线预览pdf文件流 pdf.js
    技术团队:研发中的短跑冲刺和马拉松游戏
  • 原文地址:https://blog.csdn.net/lerp020321/article/details/140964411