1.变量定义

变量命名规则:

  • 可以包含字母,数字,下划线,首字母不能用数字开头,中间不能又空格;

  • 为变量赋值等号之间不能为空格;

  • 变量命名不能使用标点符号,不能使用bash的关键字;

  • shell中默认的变量的类型都是字符,就算是数字字符也会被认为是字符串,如果需要进行数值相加,则必须指定变量为数值;

  • 如果定义的变量中没有空格,则定义变量时可以使用单引号或双引号,也可以使用,如:name=zs,如果变量中包含了空格,则必须使用单引号或双引号引起来,如:"Kent Beck”

  • 可以使用命令的结果作为变量的值,但必须使用 `` 或 $() 符号,如: d=$(ls /etc) 获取etc目录下的所用文件赋给d;

  • 环境变量一般用大写,编程习惯;

变量命令示例:

# 以下时合法的变量名
ABC
ROOT__PATH
_var
var2

# 以下时非法的变量名
12abc
?abc

1.1.变量赋值

# 显示负值
name="zs" #正确
name = "zs" #错误


# 变量的使用
echo $name
echo ${name} #也可以这样写,花括号是可选的


# 使用语句为变量赋值
for f in $(ls /etc) # 将/etc目录下的所有文件循环赋给f变量
for f in `ls /etc` # 这样写也可以
# 变量可以重新定义
name="ww"
echo $name
name="zl"
echo $name 

双引号和单引号的区别?

root@zking:~# var=1 2 3
2: command not found
root@zking:~# VAR="1 2 3"
root@zking:~# echo $VAR
1 2 3
root@zking:~# VAR='1 2 3'
root@zking:~# echo $VAR
1 2 3
root@zking:~# ^C
root@zking:~#  

 

在变量赋值时,如果值有空格,Shell 会把空格后面的字符串解释为命令。

看不出什么区别,再举个说明:

root@zking:~# N=3
root@zking:~# VAR="1 2 $N"
root@zking:~# echo $VAR
1 2 3 

单引号是告诉 Shell 忽略特殊字符,而双引号则解释特殊符号原有的意义,比如$、!。  

1.2.只读变量

# 定义只读变量,该变量不能修改
name="avdfd"
readonly name
# 运行时会提示该变量是只读变量 

 

1.3.删除变量

# 删除v1变量
unset v1


# set可以查看所有的变量,包括环境变量和用户自定义的变量
set 

删除只读变量?

1.4.变量引用

Shell 中所有变量引用使用$符,后跟变量名。

root@zking:~# VAR=123
root@zking:~# echo $VAR
123
root@zking:~# VAR+=456
root@zking:~# echo $VAR
123456 

还有时候变量名与其他字符串紧碍着,也会误认为是整个变量:

root@zking:~# VAR=123
root@zking:~# echo $VAR
123
root@zking:~# echo $VAR456

root@zking:~# echo ${VAR}456
123456

将命令结果作为变量值:

root@zking:~# VAR=`echo 123`
root@zking:~# echo $VAR
123
root@zking:~# VAR=$(echo 123)
root@zking:~# echo $VAR
123 

 

2.变量类型

  • 自定义变量:用户自己定义的变量,或者叫作本地变量;

  • 环境变量:保存和系统操作环境相关的变量,可以添加环境变量;

  • 位置变量:主要用于向脚本中传递参数或数据,变量名不能自定义,作用固定;

  • 预定义变量:在Bash中已经定义好的变量,变量的作用也是预先定义好的;

2.1.自定义变量

用户自定义的变量也叫本地变量,只在定义它的当前shell中才也可以使用。

参考变量定义中的变量赋值即可。

2.2.环境变量

在命令行提示符直接执行 env、set 查看系统或环境变量。env显示用户环境变量,set显示Shell预先定义好的变量以及用户变量。可以通过 export 导出成用户变量。

可以理解为环境变量与本地变量的区别就是作用范围不同。

 

一些写 Shell 脚本时常用的系统变量:

变量说明
$SHELL默认 Shell
$HOME当前用户家目录
$IFS内部字段分隔符
$LANG默认语言
$PATH默认可执行程序路径
$PWD当前目录
$UID当前用户 ID
$USER当前用户
$HISTSIZE历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间
$RANDOM随机生成一个 0 至 32767 的整数
$HOSTNAME主机名

export 是一个Shell内置命令,用于将变量设置为环境变量,使其在当前Shell及其子Shell中都能被访问。环境变量通常用于配置Shell环境、系统行为、应用程序参数等。

基本语法:

export VARIABLE_NAME=value

 

2.3.位置变量

位置变量指的是函数或脚本后跟的第 n 个参数。

参数说明
$nn是数字,$0表示命令的本身,$1-9表示第1到第9个参数,10以上的参数需要用{}括起来,例如${10}
$*表示命令行中的所有参数,$*把所有参数看成一个整体
$@表示命令行中的所用参数,与$*不同的是$@把每个参数区分对待,可以将这个整体看作是一个数组,数组中的每个元素都是独立的
$#代表命令行中所有参数的个数

示例一:  

root@zking:~# vim paramdemo.sh

#!/bin/bash
echo $0
echo $1
echo $2
echo $3

# 赋权
root@zking:~# chmod 755 paramdemo.sh 
root@zking:~# ./paramdemo.sh 1 2 3 4
./paramdemo.sh
1
2
3

 

示例二:  

root@zking:~# vim paramdemo02.sh

#!/bin/bash
echo "参数个数:$#"
echo "所有的参数(作为一个整体):$*"
echo "所有的参数(区分对待每个参数):$@"

root@zking:~# 
root@zking:~# chmod 775 paramdemo02.sh
root@zking:~# ./paramdemo02.sh 1 2 3 4 7
参数个数:5
所有的参数(作为一个整体):1 2 3 4 7
所有的参数(区分对待每个参数):1 2 3 4 7

 

2.4.预定义变量

参数说明
$?最后一次执行命令的返回状态,如值为0则说明成功,如值为非0,则说明命令执行不正确
$$当前进程的进程号
$!后台运行的最后一个进程的进程号

 

 

示例一:

root@zking:~# ls
a.txt  paramdemo02.sh  paramdemo.sh  snap  workspace
root@zking:~# echo $?
0
root@zking:~# ls /fafaf
ls: cannot access '/fafaf': No such file or directory
root@zking:~# 
root@zking:~# echo $?

 

3.键盘输入

read命令从标准输入读取,并把输入的内容复制给变量。

命令:read [选项] [变量名] 

参数说明:

选项说明
-p提示信息,等待输入时的提示
-t秒数,用于指定等待的时间,单位时秒
-n字符数,只要接收到指定的字符数就会执行
-s隐藏输入的数据,用于机密信息的输入,比如密码

更多参数,请使用read -help查看。

 

 

示例一:

root@zking:~# vim readdemo.sh

#!/bin/bash
read -t 60 -p "请输入账号: " userName
echo "输入的账号是: $userName"
read -s -t 60 -p "请输入密码:" password
echo -e "\n"
echo “输入的密码: $password”
read -n 1 -t 30 -p "请选择[y/n]" select
echo -e "\n"
echo "输入的选择是: $select"

root@zking:~# chmod 775 readdemo.sh 
root@zking:~# ./readdemo.sh 
请输入账号: admin
输入的账号是: admin
请输入密码:

“输入的密码: 1234”
请选择[y/n]y

输入的选择是: y 

 

4.数值运算

4.1.为什么数值需要特殊处理

shell中变量默认都是字符型的,不管是其字面值是不是数值,所以当两个变量相加时,默认是字符串拼接的操作,例如:

root@zking:~# num1=1
root@zking:~# num2=2
root@zking:~# num3=$num1+$num2
root@zking:~# echo $num3
1+2 

4.2.声明变量类型

格式: declare [+/-][选项] 变量名 

参数说明:

参数说明
-给变量设置类型属性
+取消变量的类型属性,注意与我们的日常习惯不同
-i将变量指定为整型
-x将变量声明为环境变量
-p显示指定变量被设置的类型

 

示例一:

root@zking:~# num1=1
root@zking:~# num2=2
root@zking:~# num3=$num1+$num2
root@zking:~# echo $num3
1+2
# 此处是数值相加,而不是字符串相加了
root@zking:~# declare -i num4=$num1+$num2
root@zking:~# echo $num4

4.3. expr或let数值运算工具

除了 Shell 本身的算数运算表达式,还有几个命令支持复杂的算数运算:

root@zking:~# a=1
root@zking:~# b=2
root@zking:~# let c=$a+$b
root@zking:~# echo $c
3

# 注意空格问题
root@zking:~# c=$(expr $a+$b)
root@zking:~# echo $c
1+2
root@zking:~# c=$(expr $a + $b)
root@zking:~# echo $c
3

 

4.4.$((表达式))或$[表达式]

root@zking:~# a=5
root@zking:~# b=6
root@zking:~# c=$((a+b))
root@zking:~# echo $c
11


root@zking:~# b=8
root@zking:~# a=9
root@zking:~# c=$[a+b]
root@zking:~# echo $c
17 

5.运算符

优先级运算符说明
1=, +=, -=, *=, /=, %=, &=, ^=各种赋值
2&&逻辑与
3^按位异或
4&按位与
5==, !=等于,不等于
6>, <, <=, >=大于,小于,大于等于,小于等于
7>>, <<按位左移,按位右移
8+, -加,减
9*, /, %乘,除,取余
10!, ~逻辑非,按位取反,或补码
11-,+单目,正负运算符

优先级的数值越大,优先级越高,注意和其他语言的数值越低优先级越高不同。  

root@zking:~# num=$[(15+34)*5/2]
root@zking:~# echo $num
122
root@zking:~# b=$((19%2))
root@zking:~# echo $b
1
root@zking:~# c=$((1&&0))
root@zking:~# echo $c

 

空格总结

  1. 定义变量时,=号两边不可以留空格

  2. 使用反引号的时候,运算符两边必须留空格;使用$()的时候,运算符两边不可以留空格

  3. if条件测试语句的时候,[ ]两边要留空格,比较符两边也要留空格

  4. 命令和其之后的参数或对象之间一定要有空格

  5. $后不能有空格

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS中的Map和WeakMap区别和联系

JavaScript 中 Map 与 WeakMap 的区别、联系及示例核心区别特性MapWeakMap键的类型允许任意类型的键&#xff08;对象、原始值&#xff09;键必须是对象&#xff08;非原始值&#xff09;垃圾回收强引用键 → 阻止垃圾回收弱引用键 → 不影响垃圾回收可遍历性支持遍历&#xff…

Linux 环境 libpq加载异常导致psql 连接 PostgreSQL 库失败失败案例

文章目录局点现象定位结论局点环境补充知识点如下库文件加载顺序关键事实&#xff1a;您系统中的证据&#xff1a;优先级对比表&#xff1a;解决方案强化&#xff1a;最终检查&#xff1a;本局点解决方法局点现象 数据库 mdm 升级失败检查日志, 发现是由于 psql 连接数据库报错…

C# XML 文件

在 C# 中处理 XML 文件是非常常见的操作&#xff0c;可以使用System.Xml命名空间中的类来实现。以下是一些常用的 XML 操作示例&#xff1a; 手册链接&#xff1a; System.Xml 命名空间 XmlDocument 创建一个xml数据格式的文档 XmlDocument xml new XmlDocument(); Xml…

LOVON——面向足式Open-Vocabulary的物体导航:LLM做任务分解、YOLO11做目标检测,最后L2MM将指令和视觉映射为动作(且解决动态模糊)

前言 因为项目需要(比如我们在做的两个展厅讲解订单)&#xff0c;近期我一直在研究VLN相关&#xff0c;有些工作哪怕暂时还没开源(将来可能会开源)&#xff0c;但也依然会解读&#xff0c;比如好处之一是构建完整的VLN知识体系&#xff0c;本文便是其中一例 我在解读过程中&am…

【Django】-3- 处理HTTP响应

HttpResponse 家族” 的常用操作&#x1f31f;1. 设置状态码 &#x1f44b;状态码是服务器告诉客户端 “请求处理结果” 的数字暗号&#xff08;比如 404 表示 “没找到页面”&#xff09;。Django 里有 3 种设置方式&#xff1a;方式 1&#xff1a;直接写数字&#xff08;简单…

《React Router深解:复杂路由场景下的性能优化与导航流畅性构建》

路由系统是连接用户操作与应用功能的中枢神经,而React Router作为React生态中处理路由逻辑的核心工具,其在复杂应用中的表现直接决定着用户体验的优劣。当应用规模扩张至数十甚至上百个路由,嵌套层级跨越多层,导航控制中的性能问题便会逐渐凸显——从首屏加载的延迟到路由切…

网络与信息安全有哪些岗位:(4)应急响应工程师

想知道网络与信息安全领域有哪些具体岗位吗&#xff1f; 网络与信息安全有哪些岗位&#xff1a;&#xff08;1&#xff09;网络安全工程师-CSDN博客 网络与信息安全有哪些岗位&#xff1a;&#xff08;2&#xff09;渗透测试工程师_网络安全渗透工程师-CSDN博客 网络与信息安…

Leetcode 3634. Minimum Removals to Balance Array

Leetcode 3634. Minimum Removals to Balance Array 1. 解题思路2. 代码实现 题目链接&#xff1a;3634. Minimum Removals to Balance Array 1. 解题思路 这一题思路上就是一个滑动窗口的思路。 我们首先将整个数组有序排列&#xff0c;然后分别从左向右考察每一个元素作为…

C#/.NET/.NET Core优秀项目和框架2025年7月简报

前言 每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架&#xff08;每周至少会推荐两个优秀的项目和框架当然节假日除外&#xff09;&#xff0c;推文中有项目和框架的详细介绍、功能特点、使用方式以及部分功能截图等。注意&#xff1a;排名不分先后&#xff0c;都是十分…

第 10 篇:深度学习的“军火库”——CNN、RNN与Transformer,AI如何看懂世界?

《人工智能AI之机器学习基石》系列⑩ 专栏核心理念: 用通俗语言讲清楚机器学习的核心原理,强调“洞察 + 技术理解 + 应用连接”,构建一个完整的、富有启发性的知识体系。 引

深度学习—功能性函数代码 common.py

函数&#xff1a;返回GPU def try_gpu(i0): #save"""如果存在&#xff0c;则返回gpu(i)&#xff0c;否则返回cpu()"""if torch.cuda.device_count() > i 1: # 如果存在第 i 个 GPUreturn torch.device(fcuda:{i}) # 返回第 i 个 GPU 设…

南太平洋金融基建革命:斐济-巴新交易所联盟的技术破局之路 ——从关税动荡到离岸红利,跨境科技如何重塑太平洋资本生态

一、今日焦点&#xff1a;全球关税震荡与南太平洋的“技术联盟”机遇 1. 特朗普关税大限引爆亚太市场波动&#xff0c;小经济体承压寻路 2025年8月1日&#xff0c;特朗普正式签署行政令&#xff0c;对多国征收10%-41%的“对等关税”。韩国首当其冲&#xff0c;综合指数暴跌近4%…

python爬取豆瓣电影评论通用代码

最近在自学python爬虫&#xff0c;今天闲来无事&#xff0c;爬了一下豆瓣数据 这个网站对于初学者来说还是很友好的注意&#xff1a;有python环境的朋友运行的时候&#xff0c;要把cookie换成自己的 通用性&#xff1a;可以自己换不同的电影id进行数据爬取 Tip&#xff1a;slee…

构建属于自己的第一个 MCP 服务器:初学者教程

为什么需要 MCP 服务器&#xff1f; 你是否遇到过这样的场景&#xff1a;向 AI 助手&#xff08;比如 GitHub Copilot&#xff09;询问 “北京今天的天气”&#xff0c;得到的回复却是 “我无法访问实时天气数据”&#xff1f; 这是因为大多数 AI 模型本身 “与世隔绝”—— 它…

个人项目介绍:语音识别小助手

一、项目内容 基于STM32F103RCT6制作了一款集语音识别、按键控制、信息显示、温湿度监测等多功能于一体的智能设备&#xff0c;满足多样化的交互需求。 二、个人工作内容 依据项目需求&#xff0c;选定 STM32F103RCT6 单片机、SU-03T语音识别模组、AHT25 温湿度传感器等核心元件…

【Django】-1- 开发项目搭建

一、PDM Django 搭建项目&#x1f447;&#x1f3af; 核心目标用 PDM&#xff08;更现代的 Python 包管理工具&#xff09;&#xff0c;快速创建并管理 Django 项目&#xff08;Web 框架&#xff09;&#xff0c;让开发流程更丝滑✨&#x1f9e9; 分步拆解1. 创建项目用 PDM 初…

c++:设计模式训练

写一个鸟类&#xff1a;有一个多态函数&#xff1a;run 写一个企鹅类&#xff0c;继承自鸟类&#xff1a;重写 run 写一个鸵鸟类&#xff0c;继承自鸟类&#xff0c;重写 run 写一个老鹰类&#xff0c;继承自鸟类&#xff0c;重写run 写一个鸟笼&#xff0c;能够存放 不同的鸟…

配置Mybatis环境

配置Mybatis环境MyBatis是什么配置Mybatis环境MyBatis是什么 MyBatis 一个支持普通 SQL 查询、存储过程以及高级映射的持久层框架。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作&#xff0c;使得开发者可以更专注于 SQL 本身&#xff0c;而不必花费过多…

生产环境中基于Istio的Kubernetes多集群灰度发布架构实战经验分享

生产环境中基于Istio的Kubernetes多集群灰度发布架构实战经验分享 在大规模分布式微服务架构中&#xff0c;如何在多集群环境下平滑、安全地发布新版本&#xff0c;一直是保证高可用、高可靠的关键需求。本文以真实生产环境案例为基础&#xff0c;分享我们团队基于Istio Servic…

Kubernetes(k8s)之认识Pod

01了解Pod Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程。 一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。它可能由单个容器或多个容器共享组成的资源。 Kubern…