shell中的变量

本文详细介绍了Shell中的变量,包括普通变量和命令变量的定义方式,如不加引号、单引号和双引号的区别。此外,还讲解了变量的访问方法,如使用$、${}等。文章讨论了变量的分类,如本地变量、全局变量和内置变量,并阐述了如何定义和查看全局变量。最后,文章探讨了Shell内置变量的用途,如$0、$$、$#、$?以及字符串截取和默认值设定等特性。

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

1. 变量定义

1.普通变量
普通变量的定义方式有如下三种,接下来我们就分别说一下这三种方式

方式一:

变量名=变量值 重点:变量值必须是一个整体,中间没有特殊字符

方式二:

变量名=‘变量值’ 重点:不解析变量值的内容

方式三:

变量名=“变量值” 重点:如果变量值范围内,有可以解析的变量A,那么首先解析变量A,将A的结果和其他内容组合成一个整体,重新赋值给变量B

习惯:数字不加引号,其他默认加双引号

2.命令变量
命令变量有两种定义方式,接下来我们就来介绍一下这两种方式

定义方式一: 变量名=命令 注意:`是反引号

定义方式二: 变量名=$(命令)

执行流程:

​ 1、执行`或者$()范围内的命令

​ 2、将命令执行后的结果,赋值给新的变量名A

2 变量访问

查看变量:
方式一: $变量名

方式二: “$变量名”

方式三: ${变量名}

方式四:标准使用方式 “${变量名}”

取消变量: unset 变量名

3 变量分类

shell 中的变量分为三大类 本地变量、全局变量、shell内置变量

1. 本地变量
本地变量是:在当前系统的某个环境下才能生效的变量,作用范围小。

2. 全局变量
全局变量是什么
​ 全局变量是:在当前系统的所有环境下都能生效的变量。

环境是什么
​ 环境是:每打开一个终端是一个shell环境,使用非source执行方式时,会开启子进程,也是一个shell环境,称为子shell环境。

查看全局变量
​ 可以通过命令查看所有全局变量

env  # 只显示全局变量,主要是加载了~/.bashrc和/etc/profile文件

定义全局变量

方法一:

变量名=值

export 变量

方法二:(最常用)

export 变量名=值

生效范围

只对当前shell环境及子shell环境有效,shell退出后全局变量消失

全局变量演示:

python@ubuntu:~/Desktop$ env | grep user  # 当前全局变量中没有user变量

python@ubuntu:~/Desktop$ export user=python3
python@ubuntu:~/Desktop$ env | grep user  # 当前全局变量中有user变量
user=python3

打开新的终端执行env命令:
python@ubuntu:~/Desktop$ env | grep user  # 当前全局变量中没有user变量
test.sh 脚本内容如下:
 #!/bin/bash
 echo $user

 终端执行命令如下:
 python@ubuntu:~/Desktop$ user=python3
 python@ubuntu:~/Desktop$ echo $user
 python3
 python@ubuntu:~/Desktop$ bash test.sh  # 当前shell环境有user变量,但是局部变量,子shell无法使用

 python@ubuntu:~/Desktop$ export user
 python@ubuntu:~/Desktop$ bash test.sh  # user变为全局变量,子shell可以使用
 python3
 test.sh 脚本内容如下:
 #!/bin/bash
 export user=python3
 echo $user

 终端执行命令如下:
 python@ubuntu:~/Desktop$ echo $user  # 当前shell环境下没有user变量

 python@ubuntu:~/Desktop$ bash test.sh  # 在test.sh脚本中定义了全局变量
 python3
 python@ubuntu:~/Desktop$ echo $user  # 在当前shell环境下没法使用子shell定义的全局变量

如果想要自己定义的全局变量在跟系统的全局变量一样在所有环境都有效,需要在~/.bashrc或/etc/profile文件中定义:

  • 修改~/.bashrc后,直接打开新的终端,定义的全局变量就生效了,此方式只对当前用户有效
  • 修改/etc/profile时,需要重启操作系统,定义的全局变量才生效,此方式对所有用户有效
  • 上面两种方式在修改文件后,如果想让全局变量在当前终端生效,需要执行命令source ~/.bashrc或source /etc/profile

5 shell内置变量

我们之前学习的本地变量,全局变量都是需要通过定义,然后才能实现相应功能的,那么有没有一些变量我们可以直接拿过来使用实现某种具体的功能呢?有,这就是shell内置变量

和脚本文件有关

符号意义
$0获取当前执行的shell脚本文件名
$$获取执行shell脚本的进程号
$n获取当前执行的shell脚本的第n个参数值,n=1…9,当n为0时表示脚本的文件名,如果n大于9就要用大括号括起来${10}
$#获取当前shell命令行中参数的总个数
$?获取执行上一个指令的返回值(0为成功,非0为失败)

内置变量演示效果:

$0 获取脚本的名称
$$ 获取执行shell脚本的进程号

​ 示例:

 脚本内容如下:
 #!/bin/bash
 # 获取脚本的名称
 echo "我脚本的名称是: file.sh"
 echo "我脚本的名称是:$0"
 echo "我脚本执行的进程号的是:$"
  • $# 获取当前脚本传入参数的数量
  • $n 获取当前脚本传入的第n个位置的参数

示例:

脚本内容如下:
 #!/bin/bash
 # 获取当前脚本传入的参数数量
 echo "当前脚本传入的参数数量是: $#"
 # 获取指定位置的参数
 echo "第一个位置的参数是: $1"
 echo "第二个位置的参数是: $2"
 echo "第三个位置的参数是: $3"
 echo "第四个位置的参数是: $4"
  • $? 获取文件执行或者命令执行的返回状态值

示例:

终端执行命令如下:

bash nihao  # 不存在nihao文件
bash: nihao: No such file or directory
echo $?
127

ls
file1.sh  num.sh  test.sh  weizhi.sh
echo $?
0

字符串精确截取
格式:${变量名:起始位置:截取长度}
示例:

${file:0:5}       从第1个字符开始,截取5个字符
${file:5:5}       从第6个字符开始,截取5个字符
${file:0-6:3}     从倒数第6个字符开始,截取之后的3个字符

默认值相关

  • 场景一:
    变量a如果有内容,那么就输出a的变量值

​ 变量a如果没有内容,那么就输出默认的内容

​ 格式:

${变量名:-默认值}

​ 套餐示例:

如果我输入的参数为空,那么输出内容是 “您选择的套餐是: 套餐 1”

如果我输入的参数为n,那么输出内容是 “您选择的套餐是: 套餐 n”

 脚本内容如下:
 #!/bin/bash
 # 套餐选择演示
 a="$1"
 echo "您选择的套餐是: 套餐 ${a:-1}"
  • 场景二:

​ 如果变量没有定义,将默认值赋值给变量

​ 格式:

${变量名:=默认值}

​ 场景示例:

不管我说国家法定结婚年龄是多少岁,都输出国家法定结婚年龄(男性)是22岁

 脚本内容如下:
 #!/bin/bash
 # 默认值演示示例二
 a="$1"
 echo "国家法定结婚年龄(男性)是 ${a:=22} 岁"
 echo "国家法定结婚年龄(男性)是 ${a} 岁"
  • 场景三:
    ​ 当变量存在的时候输出提示信息

​ 格式:

${变量名:+提示信息}

​ 场景示例:

当脚本获取的参数时提示已经获取到参数

​ 当变量存在的时候输出提示信息

​ 格式:

    ${变量名:+提示信息}

​ 场景示例:

    当脚本获取的参数时提示已经获取到参数

小结:

1.shell三种变量: 本地+全局+内置
2.本地变量种类:

普通变量定义格式: 变量值 ‘变量值’ “变量值”

命令变量定义格式: 命令 $(命令)
3.全局变量:

查看命令:env

标准定义格式:export 变量名=变量值

4.普通变量查看方法:变量名"变量名 ""变量名" 变量名"{变量名} ""{变量名}"
5.变量取消专用命令:unset
6.shell内置变量三种类:

文件相关: $0 $n $# $?

字符串相关: ${变量名:起始位置:截取长度}

默认值相关: ${变量名:-默认值} ${变量名:=默认值} ${变量名:+默认值}

<think>好的,用户想知道如何在Shell脚本中正确调用和使用变量。首先,我需要回忆Shell变量的基本知识。根据引用[2],Bash中没有布尔类型,但可以用0和1来模拟。这可能是一个需要注意的点。 首先,变量声明。在Shell中,变量赋值不需要任何符号,直接等号,比如name="value"。但要注意等号两边不能有空格,否则会报错。这点需要强调,因为容易出错。 然后,调用变量的时候需要用$符号或者${}。比如$var或者${var}。后者在变量名后有其他字符时特别有用,可以避免歧义。比如${var}abc,这样就能正确解析变量名。引用[4]中的例子也用了$IP和$PORT,说明直接使用$变量名是常见做法。 接下来是变量的作用域。默认情况下,变量是局部的,只在当前Shell中有效。如果想在子Shell中使用,需要用export导出为环境变量。引用[1]提到,如果被调用的脚本在当前Shell执行,变量可以被主脚本获取,所以需要确认用户是否需要跨脚本使用变量。 另外,用户可能对字符串中的变量替换有疑问。比如如何在双引号和单引号中使用变量。双引号内变量会被替换,而单引号不会。例如echo "Hello $name"会替换变量,而echo 'Hello $name'则不会。引用[4]的例子中使用了单引号和双引号混合的情况,可能需要特别注意引号的嵌套。 还有,特殊变量如$0、$1、$#等,这些是Shell脚本中的位置参数和特殊变量,用户可能需要了解这些的使用方法。比如$1表示第一个参数,$#表示参数个数。 此外,变量的默认值和错误处理。比如${var:-default}表示如果var未设置或为空,使用默认值。这在脚本中处理未定义的变量时很有用,避免脚本出错。 最后,引用[3]提到了Shell的配置文件,如~/.profile,这些文件中的变量是在登录时加载的,可能影响脚本的环境变量。用户如果在脚本中遇到变量未定义的问题,可能需要检查环境变量的来源。 总结下来,用户的问题需要涵盖变量的声明、调用、作用域、引号使用、特殊变量、默认值设置以及环境变量配置等方面。需要结构清晰,逐步解释每个部分,并给出示例代码帮助理解。</think>### 如何在 Shell 脚本中调用和使用变量 #### 1. **变量声明与赋值** 在 Shell 脚本中,变量声明无需指定类型,直接通过等号赋值,且等号两侧不能有空格。例如: ```bash name="Alice" # 字符串变量 count=10 # 整型变量 failed=0 # 模拟布尔变量:0 表示 False,1 表示 True[^2] ``` #### 2. **变量调用** - **直接调用**:使用 `$` 符号引用变量: ```bash echo $name # 输出 Alice ``` - **明确作用域**:若变量名后紧跟其他字符,需用 `${}` 包裹变量名以避免歧义: ```bash echo "Value: ${count}th" # 输出 Value: 10th ``` #### 3. **变量作用域** - **局部变量**:默认仅在当前 Shell 中有效。 - **环境变量**:使用 `export` 声明后可在子进程中访问: ```bash export PATH="/usr/local/bin:$PATH" # 修改环境变量 ``` #### 4. **字符串中的变量调用** - **双引号内解析变量**:双引号允许变量替换,单引号则保持原样: ```bash echo "Hello $name" # 输出 Hello Alice echo 'Hello $name' # 输出 Hello $name ``` - **复杂场景示例**(如引用[4]的代码片段): ```bash IP="192.168.1.1" PORT=8080 php -r '$sock=fsockopen("'$IP'",'$PORT');' # 变量嵌入字符串中 ``` #### 5. **特殊变量** - **位置参数**:`$0`(脚本名)、`$1`(第一个参数)、`$#`(参数个数)等。 - **返回值**:`$?` 表示上一条命令的退出状态。 #### 6. **默认值与错误处理** - **设置默认值**:`${var:-default}` 表示若 `var` 未定义或为空,则使用 `default`: ```bash echo ${name:-"Unknown"} # 若 name 未定义,输出 Unknown ``` #### 7. **配置文件中的变量** - **全局配置**:如 `/etc/profile` 或用户级 `~/.profile`,这些文件在登录时加载[^3]。 - **脚本内生效**:若需跨脚本共享变量,需通过 `source` 命令加载配置文件: ```bash source ~/.profile # 使配置文件中变量在当前 Shell 生效 ``` --- ### 示例代码 ```bash #!/bin/bash # 声明变量 user="Bob" retries=3 # 调用变量 echo "User: $user, Retries left: ${retries}" # 修改布尔变量 failed=1 if [[ $failed -eq 1 ]]; then echo "Error occurred!" >&2 fi # 使用环境变量 export LOG_DIR="/var/log" echo "Logs saved to $LOG_DIR" ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值