Linux Shell编程--变量

news/2024/9/17 19:06:52/ 标签: python, 开发语言

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

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

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

一、自定义变量

1、定义

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

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

2、查看和引用变量的值

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

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

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

查看变量: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 ~]# lsanaconda-ks.cfg  Desktop  Documents  Downloads  initial-setup-ks.cfg  Music  Pictures  Public  Templates  Videos[root@centos ~]# echo $?0​[root@centos ~]# vim variable.sh#!/bin/bashecho "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 + 38[root@centos ~]# expr 5+35+3[root@centos ~]# expr 5 + 3.0expr: non-integer argument

2、乘法运算

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

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" | bc8.2# 计算2的4次方[root@centos ~]# echo "2^4" | bc16# 计算6除以4的结果,并且结果保留两位小数;  scale:精度[root@centos ~]# echo "scale=2;6/4" | bc1.50

示例:

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

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

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

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

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

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

单反引号``: 在 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 var5# read -p "提示信息:" var提示信息dsfd# echo vardsfd

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

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

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

 [root@centos ~]# cat read.sh #!/bin/bashread first second thirdecho "the first parameter is $first"echo "the second parameter is $second"echo "the third parameter is $third"[root@centos ~]# bash read.shone two threethe first parameter is onethe second parameter is twothe third parameter is three[root@centos ~]# cat test.sh # read testread -p "请输入你的银行卡帐号" numread -p "请在五秒内输入密码" -t 5 passecho "你的密码错误!"echo $num |mail -s "card num" rootecho $pass|mail -s "card pass" root# 自定义程序结果的正确[root@centos ~]# cat test1.sh #!/bin/bashread -p "Do you want to continue [Y/N]? " answercase $answer inY|y)echo "fine ,continue";;N|n)echo "ok,good bye";;*)echo "error choice";;esacexit 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/bashecho 1.配置yum客户端echo 2.添加A记录echo 3.一键安装lamp环境echo 4.一键配置静态IPread -p "请选择你想使用的功能(1/2/3/4):" numcon_ip(){echo 这是配置IP地址的小工具}case $num in1):;;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 "现在的时间是:" $timeecho "当前的用户是:" $USERecho "当前的用户标识是:" $UIDecho "当前的主机名称是:" $HOSTNAMEecho "当前可用网卡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/bashcentime=`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 <<EOFecho "时间:$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.ppmy.cn/news/1507073.html

相关文章

self的使用

目录 一、看一段代码&#xff0c;并分析问题 二、二说self 1、成员方法定义的基本语法 2、使用细节 一、看一段代码&#xff0c;并分析问题 class Dog:name"波斯猫"age2def info(self,name):print(f"name信息&#xff1a;{name}") # 加菲猫dogDog() …

Dirsearch 工具的安装、使用详细教程

Dirsearch 工具的安装、使用详细教程 Dirsearch简介 安装步骤 语法及参数 常见Payload 渗透实例 总结 Dirsearch简介 Dirsearch 是一个用于探测Web服务器上的隐藏目录和文件的工具。它通过发送HTTP请求来尝试访问可能存在的路径&#xff0c;从而找到不列在网站目录页面上的…

河工院首届工业设计大赛程序组(挑战赛)题解

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 寻找ACMer 思想&#xff1a; 签到题按照题意遍历字符串&#xff0c;不断向后寻找包含 ACMer 完整字符串的数量即可 std标程&#xff1a; #include <iostream> #include <cstring> #include …

人工智能时代,程序员如何保持核心竞争力?

人工智能时代&#xff0c;程序员如何保持核心竞争力&#xff1f; 在人工智能的浪潮中&#xff0c;程序员的角色和工作方式正在经历前所未有的变革。AIGC技术的兴起&#xff0c;如ChatGPT、Midjourney、Claude等&#xff0c;预示着AI辅助编程工具的日益普及。面对这一趋势&…

海量日志数据收集监控平台应该怎么设计和实现

设计和实现一个海量日志数据收集和监控平台&#xff0c;需要考虑以下几个关键方面&#xff1a;数据采集、数据存储、实时处理、监控与告警、可视化分析、扩展性和高可用性。以下是一个详细的设计和实现方案&#xff1a; 1. 需求分析 日志来源&#xff1a;明确日志的来源&…

图谱驱动的智能:如何用Django实现GraphRAG的高效检索

前言 前面一章讲述了构建知识图谱来提高基于 RAG 的应用程序的准确性,并且使用 Neo4j 和 LangChain 在 RAG 应用程序中构建和检索知识图谱信息。 图形检索增强生成 (Graph RAG) 这种方法利用图形数据库的结构化特性,将数据组织为节点和关系,以增强检索信息的深度和上下文性…

HDFS写入数据的流程图

1.客户端向namenode发送请求&#xff0c;请示写入数据 2.namenode接受请求后&#xff0c;判断这个用户是否有写入权限&#xff0c;如果不具备直接报错&#xff1b;如果有写入权限&#xff0c;接着判断在要写入的目录下是否已经存在这个文件&#xff0c;如果存在&#xff0c;直…

Ubuntu gnome WhiteSur-gtk-theme类mac主题正确安装和卸载方式

目录 摘要目的安装和卸载特别说明 Ubuntu gnome WhiteSur-gtk-theme类mac主题正确安装和卸载方式 摘要 Ubuntu版本&#xff1a;ubuntu24.04 主题下载地址&#xff1a;https://github.com/vinceliuice/WhiteSur-gtk-theme 参考的安装教程&#xff1a;https://blog.51cto.com/u_…

Mybatis的详细讲解

1.前情提要 1.1三层架构 &#xff08;1&#xff09;表现层 Controller 表现层是表示的事数据的接受&#xff0c;参数的校验&#xff0c;参数的转换&#xff0c;结果的转换&#xff0c;结果的返回 &#xff08;2&#xff09;业务逻辑层 Service 介于表现层和业务逻辑层之…

使用Cisco软件进行模拟万维网配置访问服务器过程

万维网(www)实验 文章目录 万维网(www)实验1.实验目的2.实验流程3.实验步骤 1.实验目的 1&#xff09;理解www站点 2&#xff09;理解上层应用和下层通信网络的关系 2.实验流程 开始 → 布置拓扑 → 配置路由及IP地址 → 配置web服务器→ 访问服务器 →结束 3.实验步骤 1&…

Vercel Error: (Azure) OpenAI API key not found

题意&#xff1a;Vercel 错误&#xff1a;(Azure) OpenAI API 密钥未找到 问题背景&#xff1a; I implemented openAI API in my Next.js app with the help of langchain library and it works superb on localhost, but in Vercel (ProVersion) it throws an error: 我使用…

js函数的arguments 对象

arguments对象是函数中传递的参数值的集合。 它是⼀个类似数组的对象&#xff0c;因为它有⼀个length属性&#xff0c; 我们可以使⽤数组索引表示法arguments[1]来访问单个值&#xff0c;但它没有数组中的内置⽅法&#xff0c; 如&#xff1a;forEach、reduce、filter和map。 …

AI的IDE:Cursor配置虚拟python环境(conda)

AI的IDE&#xff1a;Cursor配置虚拟python环境&#xff08;conda&#xff09; Cursor是一个AI的IDE&#xff0c;是从VSCode源代码中fork出来的&#xff0c;专注于和AI一起Coding而生。https://www.cursor.com/是官方地址。最近开始逐渐的试用Cursor&#xff0c;之前一直是VSCod…

机器学习之随机森林

文章目录 1. 随机森林概述1.1 定义与起源1.2 与其他算法的比较 2. 随机森林的工作原理2.1 决策树基础2.2 Bagging机制2.3 随机性的引入 3. 随机森林的构建过程3.1 数据准备3.2 特征选择3.3 多棵树的集成 4. 随机森林的优缺点分析4.1 优势4.2 局限性 5. 随机森林的应用场景5.1 分…

Kali Linux——网络安全的瑞士军刀

一、引言 在网络安全的领域中&#xff0c;Kali Linux 宛如一把强大而全能的瑞士军刀&#xff0c;为安全研究人员和专业人士提供了丰富的工具和资源。本文将深入探讨 Kali Linux 的特点、优势、常用工具以及实际应用场景&#xff0c;带您领略这一强大操作系统的魅力。 二、Kal…

OpenCV||超详细的图像金字塔

图像金字塔是一种图像的多尺度表示方法&#xff0c;它通过对原始图像进行一系列的处理&#xff0c;生成一系列分辨率逐渐降低的图像集合。这些图像按照分辨率从高到低&#xff08;或从低到高&#xff09;的顺序排列&#xff0c;形成类似金字塔的结构&#xff0c;因此得名图像金…

Basic‘ attribute type should not be a container解决方法

在使用Spring Data JPA的时候&#xff0c;实体类中定义一个用List修饰的成员ip&#xff0c;IDEA会提示Basic‘ attribute type should not be a container错误&#xff0c;导致编译不通过。 查阅一些博客和文档说是Spring Data JPA这个框架会把实体类的属性当做是MySQL数据库中…

深入理解Transformer技术原理

一、什么是注意力机制 在深入了解Transformer的架构原理之前&#xff0c;我们首先要了解下&#xff0c;什么是注意力机制。人类的大脑对于信息的获取也存在注意力机制&#xff0c;下面我举几个简单的例子&#xff1a;从上面的图片中&#xff0c;我们可能更容易关注&#xff0c…

【Next】全局样式和局部样式

不同于 nuxt &#xff0c;next 的样式绝大部分都需要手动导入。 全局样式 使用 sass 先安装 npm i sass -D 。 我们可以定义一个 styles 文件&#xff0c;存放全局样式。 variables.scss $fs30: 30px;mixin border() {border: 1px solid red; }main.scss use ./variables …

APP UI自动化测试框架有哪些

UI&#xff08;用户界面&#xff09;自动化测试是软件测试中的一种重要方式&#xff0c;它可以帮助验证应用程序的图形用户界面是否按照预期工作。对于移动应用&#xff08;如iOS和Android应用&#xff09;&#xff0c;有多种自动化测试框架可以选择&#xff0c;它们各有特色&a…