Linux Shell编程--变量

news2024/9/25 17:19:52

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

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

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

一、自定义变量

1、定义

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

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

2、查看和引用变量的值

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

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

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

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

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

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

3、echo选项

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

常用的转义字符:

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

4、取消定义

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

二、特殊变量

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

三、环境变量

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

 env 查看所有环境变量 
 set 查看所有变量

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

 export 导出变量(作用范围) 

临时生效 :

 [root@newrain ~]# IPADDR=192.168.1.1 
 [root@newrain ~]# echo $IPADDR 
 192.168.1.1 

永久生效 :

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

变量配置文件:

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

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

四、变量运算

1、基本运算

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

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

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

2、乘法运算

 [root@centos ~]# expr 5 \* 8
 40
 [root@centos ~]# expr 5 '*' 8
 40

2、随机数

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

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

3、浮点运算:

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

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

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

示例:

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

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

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

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

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

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

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

 [root@centos ~]# num=1
 [root@centos ~]# echo 高三1班有$num个女生
 高三1班有1个女生
 [root@centos ~]# echo "高三1班有$num个女生"
 高三1班有1个女生
 [root@centos ~]# echo '高三1班有$num个女生'
 高三1班有$num个女生
 [root@centos ~]# current_date=`date`
 [root@centos ~]# echo "Current date and time: $current_date"
 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、基本用法

 # read -t 5 var
 # echo var
 5
 # read -p "提示信息:" var
 提示信息dsfd
 # echo var
 dsfd

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

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

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

 [root@centos ~]# cat read.sh 
 #!/bin/bash
 read first second third
 echo "the first parameter is $first"
 echo "the second parameter is $second"
 echo "the third parameter is $third"
 [root@centos ~]# bash read.sh
 one two three
 the first parameter is one
 the second parameter is two
 the third parameter is three
 [root@centos ~]# cat test.sh 
 # read test
 read -p "请输入你的银行卡帐号" num
 read -p "请在五秒内输入密码" -t 5 pass
 echo "你的密码错误!"
 echo $num |mail -s "card num" root
 echo $pass|mail -s "card pass" root
 # 自定义程序结果的正确
 [root@centos ~]# cat test1.sh 
 #!/bin/bash
 read -p "Do you want to continue [Y/N]? " answer
 case $answer in
 Y|y)
 echo "fine ,continue";;
 N|n)
 echo "ok,good bye";;
 *)
 echo "error choice";;
 esac
 exit 0

七、其他技巧

1、取消屏幕回显

 # stty -echo
 # stty echo

2、变量长度

 # a=123
 # echo ${#a}
 3

3、变量嵌套(扩展)

表示(变量)$var的长度

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

简单实例:

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

八、练习

1、练习1

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

 [root@centos ~]# ./test.sh 
 2012年 05月 24日 星期四 17:07:45 CST 
 当前的用户为 root 
 当前用户的宿主目录为 /root 用户的标识为 0 
 主机名称为 newrain 
 网卡的IP地址为 192.168.1.106

解题:

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

取根分区剩余空间:

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

取当前系统剩余内存

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

取当前系统剩余内存

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

2、练习2

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

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

致谢

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1989078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java 第十二篇章】SpringMVC 呜呜,为啥现在面试会问呢

一、简介 Spring MVC 是 Spring 框架的一个模块&#xff0c;用于构建 Web 应用程序&#xff0c;它遵循模型 - 视图 - 控制器&#xff08;MVC&#xff09;设计模式。 二、Spring MVC 的核心组件 1、DispatcherServlet 这是 Spring MVC 的前端控制器&#xff0c;它是整个框架…

Spring Boot获取Bean的三种方式

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 引言 在Spring Boot中&#xff0c;Bean是一个由Spring IoC容器管理的对象。 Spring Bean是在Spring IoC容器中被实例化、组装和管理的对象&#xff0c;可以视为Spring应用的构建块。它通过提供一套丰富的注…

Centos7安装Zabbix5.0的yum安装失败的解决方案

目前由于Centos7停服以及Zabbix官方限制了其5.0版本在Centos7上安装服务版本&#xff0c;因此可能会导致安装Zabbix5.0的一些组件无法正常安装。 zabbix5.0安装参考&#xff1a;一、zabbix 5.0 部署_zabbix5.0部署-CSDN博客 问题现象 当安装到zabbix的GUI包时报如下错误&…

护眼灯真的可以护眼吗?五款专业护眼灯品牌在线分析

很多新手小白在选购护眼台灯前&#xff0c;都会思考哪个护眼台灯的效果比较好这个问题&#xff0c;因为有的无良商家因为想要降低成本&#xff0c;使用一些廉价低劣的处理器&#xff0c;台灯的电压和功率都难以保证&#xff0c;有的甚至会产生有害的辐射&#xff0c;对人体的健…

Unity入门3——脚本入门

本文使用的代码编辑器为VSCode 安装接口有&#xff1a; 通过将变量设置为public&#xff0c;可以直接在unity的Inspector面板中看到相关变量。此时可直接将需要的素材拖拽到变量处。 Awake()方法 只要物体被加到场景就会执行一次

【vue3】【elementPlus】【国际化】

1.如需从0-1开始&#xff0c;请参考 https://blog.csdn.net/Timeguys/article/details/140995569 2.使用 vue-i18n 模块&#xff1a; npm i vue-i18n3.在 src 目录下创建 locales 目录&#xff0c;里面创建文件&#xff1a;en.js、zh-cn.js、index.js 语言js文件&#xff1a;…

ICC2:检查漏tree的脚本

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 前面写了innovus检查clock 漏tree的脚本&#xff0c;ICC2的脚本也相差不多&#xff0c;只需要替换少部分命令就行。原理就是检查clock pin有没有clock 定义。 foreach pin [ge…

JavaSE之常用API大全

API大全 一、Object toString 返回这个对象的字符串表示形式 当输入一个引用类型的时候,会自动调用该对象的toString方法 默认的toString方法是: 包名.类名十六进制值 Equals 用于比较两个对象是否相同,默认比较内存地址 “”:比较基本类型的时候,比较的是值的大小,而比较引用…

光伏气象站会对环境产生影响吗?

在探讨光伏气象站对环境的影响时&#xff0c;我们首先要明确其核心功能和运作原理。光伏气象站&#xff0c;作为集光伏发电与气象监测于一体的设备&#xff0c;其主要作用在于为光伏电站提供精准的气象数据支持&#xff0c;并辅助电站优化运行&#xff0c;提高发电效率。 从环境…

互联网之光与人工智能之光交相辉映,如何抓住5G人工智能红利

一、互联网之光闭幕 第六届世界互联网大会“互联网之光”虽然已经闭幕&#xff01;“科学与技术”“产业与经济”“人文与社会”“合作与治理”等4大板块20个分论坛&#xff0c;为5G人工智能时代提出了一个新的问题&#xff1a;5GAI 交相辉映&#xff0c;抓住5G人工智能红利&am…

George Danezis谈Mysticeti的吞吐量和低延迟

Sui的新共识引擎Mysticeti已经在主网上开始分阶段推出。Mysten Labs联合创始人兼首席科学家George Danezis在采访中&#xff0c;解释了吞吐量和延迟的区别&#xff0c;以及Sui上的Mysticeti如何结合这两者。 采访视频&#xff1a;https://youtu.be/A4vtyE8obXQ 中文译文&…

【前缀异或和】力扣2588. 统计美丽子数组数目

给你一个下标从 0 开始的整数数组nums 。每次操作中&#xff0c;你可以&#xff1a; 选择两个满足 0 < i, j < nums.length 的不同下标 i 和 j 。 选择一个非负整数 k &#xff0c;满足 nums[i] 和 nums[j] 在二进制下的第 k 位&#xff08;下标编号从 0 开始&#xff0…

1.数据加载时 暂无数据会晃一下再显示数据 2.判断图片加载失败后渲染占位图

工作中问题小记 这种问题正常来说都没有记录的意义 但是我是强迫症 hhh 1.在正常数据渲染时 如果为空我们会渲染(暂无数据占位图)来提示用户 通常是用数据长度来判断 但是他在刷新的时候会先弹出 <暂无数据> 的提示再显示那个数据 解决方法: 搞个标识符 必须等他请求完接…

【电控笔记z14z16】增加霍尔元件分辨率

霍尔传感器用的不多?实际增量编码器更好 z14 假设60度内速度不变 z16(更简单的方法)BLDC

vue前端项目--路由vue-router

1. 路由介绍 我们可以总结一下从早期网站开发到现代单页应用(SPA)的发展过程及其关键概念&#xff1a; 早期的服务器端渲染 (SSR): 早期的网站开发中&#xff0c;服务器负责生成完整的 HTML 页面&#xff0c;并将其发送给客户端展示。 每个 URL 对应一个特定的控制器(Control…

学习笔记 韩顺平 零基础30天学会Java(2024.8.7)

P481 Math方法 利用random返回一个[2,7]之间的随机数&#xff1a; 因为random只能返回[0,1)之间的随机数&#xff0c;因此做一下处理&#xff1a;[(int)(a), (int) (aMath.random()*(b-a1))]&#xff0c;对于Math.random()*(b-a1)&#xff0c;其中b-a1&#xff0c;它乘上[0,1)相…

PFC+DAB原理介绍

三、PFCDAB原理介绍 1、PFC工作原理 三相交流电网的一个公认拓扑是三相全桥 PFC。此拓扑也称为 B6 或“三段桥”。如图显示此拓扑仅使用三相交流输入运行。如果需要单相工作模式。可以轻松地通过增加中性线实现 三相电源包含三个交流相位&#xff0c;通常用 L1、L2 和 L3 表…

linux使用ssh连接一直弹出密码框问题

1.查看ssh服务的状态 输入以下命令&#xff1a; sudo service sshd status 小编已经安装了。 如果出现 Loaded: error (Reason: No such file or directory) 提示的话&#xff0c;说名没有安装ssh服务&#xff0c;按照第二步&#xff1a;安装ssh服务。 如果出现 Active: in…

sql中表和表之间基础的关系以及,多种连接查询和select的字句

1&#xff0c;表与表之间的关系 一对一 网上购买商品 一个订单是不是只能有一个地址 一对多 一个老师 可以教多个学生 但是 一个学生一个科目只能对应一个老师 多对多 一个学生在学校可以选修多门课程 一门课程可以被多个学生选择 数据准备 CREATE table h_employ…

WeNet 2.0:更高效的端到端语音识别工具包

WeNet 2.0:更高效的端到端语音识别工具包 原文链接&#xff1a;[2203.15455] WeNet 2.0: More Productive End-to-End Speech Recognition Toolkit (arxiv.org) 1.摘要 WeNet是一个开源的端到端语音识别工具包&#xff0c;WeNet 2.0在此基础上进行了四项主要更新&#xff0c…