Linux Shell编程--变量

[复制链接]
发表于 2026-2-10 17:17:37 | 显示全部楼层 |阅读模式
媒介:本博客仅作纪录学习使用,部分图片出自网络,如有陵犯您的权益,请接洽删除

变量: bash作为步调计划语言和别的高级语言一样也提供使用和界说变量的功能
预界说变量、情况变量、自界说变量、位置变量
一、自界说变量

1、界说

在 Bash 中,界说变量非常简朴,不像其他高级编程语言(如 C/C++、Java 等)那么复杂。在界说一个新变量时,一样平常不须要提前声明,只需直接指定变量名称并赋值即可
  1.  变量名称=值
复制代码

  • 变量名称:只能由字母,数字,下划线构成,不能以数字开头; 注意:应该让变量名称故意义;
  • =: 赋值符号 前后不能有空格
  • :全部的字符串和数字都可以;
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之后就拥有继续性
  1.  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可以只有一个,也可以有多个,这时假如输入多个数据,则第一个数据给第一个变量,第二个数据给第二个变量,假如输入数据个数过多,则末了全部的值都给末了一个变量
  1.  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.  2012年 05月 24日 星期四 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.  现在的时间是: 24年08月01日-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 <<EOF
  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"
复制代码
致谢

在此,我要对全部为知识共享做出贡献的个人和机构体现最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,假如文章中有任何错误,接待留言指正。 
学习永无止境,让我们共同进步!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表