【Linux】变量定义规则、shell 格式、空格注意事项汇总、env和set区别

文章详细阐述了Shell脚本中关于变量赋值的规则,强调了等号两侧不能有空格以及比较时需要有空格的要点。还介绍了变量的命名格式,变量类型,包括自定义变量、环境变量、位置变量,并讲解了引用变量的方法和清除变量的unset命令。同时提到了单引号和双引号在处理包含空格的值时的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


相关文章:
【Linux】变量定义、shell 格式、空格注意事项汇总
【Linux】Shell(Bash)单引号、双引号、不加引号和反引号用法和区别详解
【Linux】 shell 常用的数据类型(数字、字符串和数组)和运算
【Linux】shell中运算符(整数、字符串)

1. 空格问题

=号可以用于赋值,也可以在 if 语句中用于比较

shell脚本对空格有严格的规定,赋值语句等号两边不能有空格,而字符串比较,等号两边必须有空格。

=号用于赋值

shell脚本变量名和等号及等号和值之间不能有空格,这可能和我们熟悉的所有编程语言都不一样,变量命名须遵循如下规则:
• 首个字符必须为字母(a-z,A-Z)。
• 中间不能有空格,可以使用下划线(_)。
• 不能使用标点符号。
• 不能使用bash里的关键字(可用help命令查看保留关键字)。

赋值语句等号两边不能有空格,正例如:

[root@localhost ~]#i=1                          # 默认是整数,自动识别

[root@localhost ~]#PROV=BeiJing                 # 默认是字符串,自动识别

用作赋值时,两边绝对不能有空格,否则会在相应的行报 command not found 错误,此时,shell是把变量当一个命令执行的,而这个命令本身又不存在,反例:

[root ~]#PROV = BeiJing

执行时会提示:./tt.sh: line 14: PROV: command not found

如果所赋的值包含空格,可以用引号括起来(没有空格时也可以用引号,效果和不用一样),例如:

PROV="anhui province"

=用于比较

字符串比较,等号两边必须有空格,如:

除了=号,所有的比较符号都要两侧保证空格,更多的符号可以参见 shell中运算符(整数、字符串)

if [ "${sdpt}" = "sdpt_js" ]; then

注意[] 中 内容与括号之间也要留一个空格;[] 外侧必须无空格,例如那个分号要紧邻 ]

强烈建议在进行比较时,禁止用单等号,应该使用双等号 ,因为单等号在 (())语句中表示赋值,避免单等号歧义

2. 变量

什么是变量,简单的说就是字面意思可变的量,比如a=1就是一个变量,变量就是一个暂时储存数据的地方,我们通过调用对应的变量名字就可以得到其对应的值。

2.1 变量命名的格式要求

在shell中给变量命名时有以下几个规则。

(1)shell变量的命名只能使用英文字母,数字和下划线,并且开头不能以数字开始。

(2)shell变量的命名中不能使用标点符号

(3)不能使用bash里的关键字(可用help命令查看保留关键字)。

正确的变量名:Name、name、_name

错误的变量名:3Name(首字母不能时数字)、na?me(不能带除了下划线外的其他标点符号)

2.2、shell定义变量中的注意事项

(1)变量名区分大小写,环境变量建议使用大写便于区分

(2)在shell中,变量和值之间不能有空格

即等号左右两侧不能有空格,如果变量需要有空格则需要使用引号,单引号和双引号在shell中有不同的作用,下面会详细说明下。

在这里插入图片描述

(3)单引号和双引号的区别

单引号不可识别特殊语法

双引号可以识别特殊语法

详情参见 【Linux】Shell(Bash)单引号、双引号、不加引号和反引号用法和区别详解

在这里插入图片描述

(3) 数字带引号和不带引号的区别

数字带引号和不带引号本质没有区别,严格来说 a=10 和 a=‘10’ 是一样的,默认都是字符串格式,但是数字形式字符串可以用于计算,而字母形式字符串不可以用于计算

a=10
b='10'
c=10
d='10'

if [ $a == $b ];then
 echo 'a==b'                      # 执行打印
else
 echo 'a!=b'
fi

if [ $a == $c ];then
 echo 'a==c'      				# 执行打印
else
 echo 'a!=c'
fi

if [ $b == $d ];then
 echo 'b==d'				# 执行打印
else
 echo 'b!=d'
fi

echo "a+1=`expr $a + 1`"       #打印 a+1=11
echo "b+1=`expr $b + 1`"		# 打印 b+1=11  ,说数字类型的字符串可以用于计算

2.3、引用变量的方法

定义好变量后该如何使用呢?使用一个定义好的变量只需要在变量前面加上 $ 符号即可。
在这里插入图片描述
可以看出带不带{}对变量进行输出时,输出结果都是一样的,但是一般情况下最好带上{},这样能很明确的看到变量名的界限。

当你的变量后面已经没有其他字符了或者后面是空格,加不加{} 都一样

[yyx@yyx12 ~]$ A="he is a teacher"
[yyx@yyx12 ~]$ echo "${A}"       #此时可以不用{} 

[yyx@yyx12 ~]$ echo "${A} , a good teacher"          #此时可以不用{} 

但是如果变量后面不是空格,还有其他字符,必须加{},进行边界限定:

[yyx@yyx12 ~]$ A="he is a teach"
[yyx@yyx12 ~]$ echo "${A}er"          # 此时必须用{} 

2.4、变量的类型

常见 Shell 变量的类型包括:自定义变量、环境变量、位置变量、预定义变量

(1)自定义变量

自定义变量就是我们平常用的最多的变量,定义自定义变量的方法为 变量名=变量值,我们可以对变量的名字自定义,但是必须要符合命名规则。
在这里插入图片描述

(2)环境变量

环境变量又可以叫做全局变量,定义环境变量时,需要使用export去声明。(和自定义变量的区别,自定义变量时局部变量,其变量的范围是仅在当前的Shell中生效,环境变量又可被叫做全局变量,其变量的范围是会在当前Shell和其子Shell中都生效)
在这里插入图片描述
为什么叫环境变量?因为你可以通过env命令查看所有的环境变量 ,或者通过env | grep xxx进行搜索

(3)位置变量

位置变量就是bash将传递给脚本的参数,按照位置不同,保存在不同的位置变量中,以便于脚本调用这些变量,位置变量属于预定义变量的一种,常见的位置变量有 n ( n 代表数字)、 n(n代表数字)、 nn代表数字)、*、 @ 、 @、 @#。

$n:$0表示脚本的名称、$1-n代表里面的参数,10以上的参数需要大括号表示比如:{10}

$*:显示向脚本传递的所有参数,但是会把所有的参数看成一个整体

$@:显示向脚本传递的所有参数,但是会把每个参数单独进行展示

$#: 表示传递到脚本的参数的个数

示例,创建一个脚本,命名为 wzbl.sh:

#! /bin/sh
echo "shell脚本名字:$0"
echo "参数1:$1"
echo "参数2:$2"
echo "参数3:$3"
echo "参数4:$4"
echo "参数5:$5"
echo "参数6:$6"
echo "参数7:$7"
echo "参数8:$8"
echo "参数9:$9"
echo "参数10:${10}"
echo "所有的参数,以一个字符串显示:$*"
echo "所有的参数,区分每个字符串显示:$@"
echo "显示传递到脚本的参数的个数:$#"               

运行结果:
在这里插入图片描述

(4)系统变量(内置变量)

预定义变量也是Bash中已经定义好的变量,变量名不能自定义,变量作用是固定的。常见的预定义变量有$?、$$、$!

  • $?:前一条命令执行后的返回状态,返回值为0表示执行正确,返回任何非0值均表示执行出现异常
    在这里插入图片描述

  • $$:返回当前进程的进程号(PID)

    脚本:

    #! /bin/bash
    echo "输出当前进程的进程号(PID):$$"
    

    运行结果:
    在这里插入图片描述

  • $!:返回最后一个后台进程的进程号(PID)
    在这里插入图片描述

2.5 查找变量env和set区别

env是查看所有的环境变量,即通过export导出的变量

而set是查看所有的变量,包含env和用户自定义的变量,因此env是set的子集。

可以通过 evn | grep xxxx 或 set | grep xxx进行搜索

2.6 清除变量(unset 命令)

清除变量可以通过unset 命令,该命令后跟变量的名称(不用加上变量引导符$),当变量清除后其值为空。

例如创建一个变量后通过echo命令输出该变量,然后在通过unset命令清除后再次输出该变量:

[yyx@yyx12 ~]$ words="Linux is an operating system" 
[yyx@yyx12 ~]$ echo $words
Linux is an operating system
[yyx@yyx12 ~]$ unset words
[yyx@yyx12 ~]$ echo $words    #此时输出空
                              

参考

shell 脚本中 空格的注意问题:= 赋值两边不能有空格,而if比较判断时 = 两边必须加空格
Shell变量赋值语句不能有空格
Linux与Shell学习–shell系列3–变量

<think>好的,我现在需要回答用户关于在Windows的cmd中使用set命令定义变量,以及如何在Windows ShellLinux中设置环境变量。首先,我需要回顾用户之前的对话,确保回答的一致性。用户之前询问了Windows环境变量的查看设置方法,现在进一步询问cmd中的set命令、Windows Shell(可能指PowerShellLinux的设置方法。 首先,处理Windows cmd部分。用户已经知道使用set命令,但可能需要更详细的说明,比如临时变量永久变量区别。之前的回答中提到了set用于临时设置,setx用于永久,所以这里需要再次强调这一点,并给出具体例子。 接下来是Windows Shell,用户可能指的是PowerShell。在之前的回答中,我提到了PowerShell使用$env:变量名来设置临时变量,以及使用[Environment]::SetEnvironmentVariable方法设置永久变量。这里需要详细说明这两种方法,并举例说明。 然后是Linux部分,用户可能想知道如何在Bashshell中设置环境变量。需要区分临时永久设置。临时设置可以通过export命令,永久则需要修改配置文件如.bashrc、.profile或/etc/environment等。需要说明不同配置文件的适用范围,比如用户级系统级。 需要注意用户可能的混淆点,比如不同shell之间的差异,或者设置环境变量后的生效方式(需要重新加载配置文件或重启终端)。另外,权限问题,如在Linux中修改系统级变量需要sudo权限,也要提及。 还要确保回答结构清晰,分点说明每个系统的设置方法,可能分为三个大标题:Windows CMD、Windows PowerShellLinux,每个部分下再分临时永久设置。同时,注意使用中文,避免使用Markdown格式,但保持段落代码块的清晰。 需要检查是否有遗漏,例如Windows中除了setsetx,是否有其他方法?或者Linux中不同发行版是否有差异?不过通常来说,export配置文件的方法是通用的,可以不用深入发行版差异。 最后,确保语言简洁明了,步骤清晰,用户能够按照指示操作。可能还需要注意事项,比如变量作用域、路径分隔符的不同(Windows用分号,Linux用冒号)等,但用户的问题主要是设置方法,所以这些可以作为补充提及。</think>### Windows CMD 中通过 `set` 命令定义变量 #### 1. **临时变量(仅当前 CMD 窗口有效)** ```cmd set 变量名=值 # 定义变量(值中无需引号,除非包含空格set 变量名= # 清空变量 set 变量名 # 查看变量值 ``` **示例**: ```cmd set MY_VAR=HelloWorld # 定义变量 echo %MY_VAR% # 输出变量值(输出:HelloWorld) ``` #### 2. **永久变量(需管理员权限)** 使用 `setx` 命令(需重启或新开窗口生效): ```cmd setx 变量名 "值" # 用户级变量(仅当前用户) setx 变量名 "值" /M # 系统级变量(需管理员权限) ``` **示例**: ```cmd setx JAVA_HOME "C:\Java\jdk17" # 用户变量 setx PATH "%PATH%;C:\tools" /M # 系统 PATH 变量(追加路径) ``` --- ### Windows PowerShell 中设置变量 #### 1. **临时变量(仅当前会话有效)** ```powershell $env:变量名 = "值" # 定义变量 $env:变量名 # 查看变量值 ``` **示例**: ```powershell $env:TEMP_DIR = "C:\Temp" echo $env:TEMP_DIR # 输出:C:\Temp ``` #### 2. **永久变量** 通过 .NET 方法修改注册表(需管理员权限): ```powershell # 用户级变量 [Environment]::SetEnvironmentVariable("变量名", "值", "User") # 系统级变量 [Environment]::SetEnvironmentVariable("变量名", "值", "Machine") ``` **示例**: ```powershell [Environment]::SetEnvironmentVariable("PYTHON_PATH", "C:\Python39", "User") ``` --- ### Linux 中设置环境变量 #### 1. **临时变量(仅当前终端有效)** ```bash export 变量名=值 # 定义变量(值中若含空格需加引号) unset 变量名 # 删除变量 ``` **示例**: ```bash export APP_PORT=8080 echo $APP_PORT # 输出:8080 ``` #### 2. **永久变量** - **用户级**:修改 `~/.bashrc` 或 `~/.bash_profile` ```bash echo 'export 变量名="值"' >> ~/.bashrc # 追加变量定义 source ~/.bashrc # 立即生效 ``` **示例**: ```bash echo 'export JAVA_HOME="/usr/lib/jdk17"' >> ~/.bashrc ``` - **系统级**:修改 `/etc/environment` 或 `/etc/profile` ```bash sudo nano /etc/environment # 编辑文件(需 root 权限) # 添加:变量名="值" source /etc/environment # 生效 ``` --- ### 关键区别 | 系统 | 临时设置命令 | 永久设置方法 | 路径分隔符 | |------------|-------------------------|--------------------------------------|------------| | Windows CMD| `set` | `setx` 或图形界面 | `;` | | PowerShell | `$env:变量名` | `.NET API` | `;` | | Linux | `export` | 修改 `~/.bashrc` 或 `/etc/environment` | `:` | **注意事项**: 1. Windows 变量名不区分大小写,Linux 区分大小写。 2. 修改系统级变量需管理员权限(Windows 用 `/M`,Linux 用 `sudo`)。 3. 永久变量需重启终端或运行 `source` 命令生效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值