shell脚本(一)环境变量

本文介绍了baseshell中的环境变量类型,包括全局变量和局部变量的区别,如何查看、设置和删除环境变量,以及如何处理PATH环境变量和数组变量。适用于希望深入了解shell环境变量管理的读者。

base shell中环境变量分为两类:全局变量、局部变量

全局环境变量

全局环境变量对于shell会话和所有生成的子shell都是可见的。局部变量只对创建他们的shell可见。

查看全部全局变量命令:env或printenv

查看个别环境变量命令:printenv [变量名称]

使用$打印变量

echo $变量名称

局部环境变量

局部变量只能在定义他们的进程中可见。

查看局部环境变量命令:set(set命令会显示出所有环境变量,包括局部变量、全局变量以及用户自定义变量)

设置环境变量

设置局部用户自定义变量

命令格式:[变量名]=[变量值]

定义变量时不允许有空格,否则空格后会被当成命令执行,如果变量值有空格可以用双引号来界定。

设置全局变量

创建全局变量的方法是先创建一个局部环境变量,然后再把它导出到全局环境中。

命令格式:export [变量名]

通过bash命令开启子shell(exit命令退出),查看父shell设置的全局变量。在子shell中修改全局变量并不会更改父变量值,只在自己当生效。

删除环境变量

可以用unset命令删除环境变量。

命令格式:unset [环境变量名称]

在处理全局变量时,在子进程中删除了一个全局变量只对当前子进程有效。

设置PATH环境变量

当在shell命令行输入外部命令时,shell必须搜索系统来找到对应程序。PATH环境变量定义了用于进行命令和程序查找的目录。

查看PATH变量:echo $PATH

PATH环境变量是用冒号隔开目录信息,所以如果想更高PATH变量可以直接引用原先值增加自己要追加的目录,如:

PATH=$PATH:/home/script

将目录驾到PATH目录中,就可以在任意目录执行命令(加入PATH程序的命令)。对PATH的修改只能到退出或重启系统,如果想一直有效可以修改/etc/profile文件,/etc/profile是系统默认bash shell的主启动文件。系统上每个用户登陆时都会执行这个启动文件,可以将更改命令加入到这个文件中。

查看/etc/profile文件命令:cat -n /etc/profile

观察profile代码,发现有for循环循环/etc/profile.d文件夹目录并执行里面可读文件,所以也可以将修改环境变量脚本(.sh脚本)加入到这个目录下也会生效(推荐这种方法,比加到/etc/profile文件中好,因为有些操作会更新/etc/profile文件,比如升级所用的发型版本)。

数组变量

环境变量可以作为数组使用,可以存多个变量,这些值可以单独引用,也可以作为数组引用。

定义数组变量格式:[变量名]=(var1 var2 var3 var4),数组元素用空格隔开。

定义数组变量:array=(zqq zqq1 zqq2 zqq3)

输出数组变量默认输出第一个:echo $array

输出数组固定元素:echo ${array[1]}

输出数组全部元素:echo ${array[*]}

修改索引位置的值:array[1]=zqq11

删除索引位置的值:unset array[1]

删除数组变量:unset array

<think>我们正在讨论如何使用shell脚本添加环境变量。根据引用,我们可以从多个角度来处理:临时设置和永久设置(针对当前用户或所有用户)。同时,我们需要注意环境变量的作用范围(当前Shell环境、子进程等)。 核心思路: 1. 临时环境变量:仅在当前Shell会话中有效(包括其子进程),退出后失效。 方法:直接在shell脚本中使用`export`命令,然后在当前Shell中运行该脚本时,需要使用`source`(或`.`)命令来执行,这样变量才会在当前Shell中生效。如果直接运行脚本(作为子进程运行),则变量只在该子进程及其子进程中有效,不会影响父进程。 2. 永久环境变量:将环境变量添加到配置文件中,使得每次登录时自动加载。 用户级配置文件:`~/.bashrc`, `~/.profile`, `~/.bash_profile`(具体取决于系统) 系统级配置文件:`/etc/profile`, `/etc/environment`等 下面我们分别说明。 、临时设置环境变量(在当前Shell会话中生效) 我们可以创建shell脚本(例如`set_env.sh`),内容如下: ```bash #!/bin/bash # 设置临时环境变量 export MY_VAR="my_value" ``` 然后,我们使用`source`命令来执行这个脚本,而不是直接运行: ```bash source set_env.sh ``` 或者 ```bash . set_env.sh ``` 这样,`MY_VAR`就会在当前Shell中生效。 注意:如果直接执行`./set_env.sh`,那么变量只在脚本运行的子进程中有效,当前Shell不会改变。 二、永久设置环境变量 1. 针对当前用户:将环境变量添加到用户主目录下的某个配置文件中(如`~/.bashrc`或`~/.profile`)。 例如,我们编辑`~/.bashrc`: ```bash echo 'export MY_VAR="my_value"' >> ~/.bashrc ``` 然后运行`source ~/.bashrc`使其立即生效,或者下次登录时自动生效。 2. 针对所有用户:将环境变量添加到`/etc/profile`(需要root权限)。 ```bash sudo echo 'export MY_VAR="my_value"' >> /etc/profile ``` 然后运行`source /etc/profile`使其立即生效,或者下次登录时自动生效。 注意:有些系统可能使用`/etc/environment`文件(该文件不需要`export`,直接写`变量名=值`),例如: ```bash echo 'MY_VAR="my_value"' | sudo tee -a /etc/environment ``` 三、通过shell脚本添加永久环境变量 我们可以编写shell脚本来自动完成向配置文件中添加环境变量的操作。 示例脚本(添加用户级环境变量到`~/.bashrc`): ```bash #!/bin/bash # 定义要添加的环境变量 VAR_NAME="MY_VAR" VAR_VALUE="my_value" # 检查是否已经存在该变量 if grep -q "export $VAR_NAME=" ~/.bashrc; then echo "环境变量 $VAR_NAME 已在 ~/.bashrc 中设置,跳过" else echo "export $VAR_NAME=\"$VAR_VALUE\"" >> ~/.bashrc echo "已添加环境变量 $VAR_NAME 到 ~/.bashrc" # 使其立即生效(可选) source ~/.bashrc fi ``` 注意:在脚本中执行`source ~/.bashrc`只会影响当前脚本进程(子进程),而不会影响父进程(即运行该脚本Shell)。所以,在脚本中执行`source`后,在父Shell中变量仍然不会生效。因此,通常我们会在脚本中提示用户手动执行`source ~/.bashrc`或者重新登录。 四、注意事项 1. 在脚本中修改配置文件后,如何使其在当前Shell生效? 由于脚本运行时会创建子进程,在子进程中修改环境变量不会影响父进程。所以,如果希望当前Shell立即生效,必须在当前Shell中执行`source`命令。因此,我们通常在脚本中不会自动`source`配置文件,而是提示用户自己执行。 2. 环境变量的覆盖:如果同个变量在多个配置文件中设置,后加载的会覆盖前面的。 3. 系统级配置文件的修改需要root权限,并且要谨慎,因为会影响所有用户。 4. 环境变量的命名:通常使用大写字母,避免使用特殊字符。 五、示例:通过脚本添加Java环境变量 根据引用[5],有时候我们需要设置库文件路径(LD_LIBRARY_PATH)等。下面是设置Java环境变量脚本示例(永久设置): ```bash #!/bin/bash # 设置JAVA_HOME JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64" # 检查是否已经设置 if grep -q "export JAVA_HOME=" ~/.bashrc; then echo "JAVA_HOME 已在 ~/.bashrc 中设置,跳过" else # 写入配置文件 echo "export JAVA_HOME=\"$JAVA_HOME\"" >> ~/.bashrc echo 'export PATH="$JAVA_HOME/bin:$PATH"' >> ~/.bashrc echo "已添加 JAVA_HOME 到 ~/.bashrc" # 提示用户 echo "请运行以下命令使环境变量生效:" echo "source ~/.bashrc" fi ``` 六、临时设置和永久设置的选择 1. 临时设置:适合临时测试,不希望影响其他Shell会话。 2. 永久设置:需要长期使用的环境变量(如JAVA_HOME, PATH等)。 总结: 使用shell脚本添加环境变量有两种主要方式:临时生效(通过`export`,但需要当前Shell用`source`执行)和永久生效(写入配置文件)。在编写脚本时,需要注意环境变量的作用域以及脚本执行方式带来的影响。 下面生成相关问题。 </think>### 如何在 Shell 脚本中添加环境变量Shell 脚本中添加环境变量主要有两种方式:**临时设置**(仅在当前会话有效)和**永久设置**(持久化到配置文件)。以下是具体方法和操作步骤: --- #### 、临时环境变量设置(当前会话有效) ```bash #!/bin/bash # 临时环境变量设置(退出终端后失效) export TEMP_VAR="临时变量值" # 使用export声明 echo "临时变量值: $TEMP_VAR" ``` **执行方式:** ```bash source script.sh # 或 . script.sh(变量在当前终端生效) ``` **特点:** - 变量仅存在于当前 Shell 进程及其子进程[^2] - 关闭终端后自动失效 - 适合短期测试或脚本内部使用 --- #### 二、永久环境变量设置(用户级/系统级) ##### 1. 用户级配置(仅影响当前用户) **编辑用户配置文件:** ```bash #!/bin/bash # 永久添加到当前用户环境 echo 'export USER_VAR="用户变量值"' >> ~/.bashrc # 建议位置[^4] echo 'export PATH="$PATH:/自定义路径"' >> ~/.bashrc # PATH扩展示例 ``` **生效命令:** ```bash source ~/.bashrc # 立即生效 ``` ##### 2. 系统级配置(影响所有用户) ```bash #!/bin/bash # 永久添加到系统环境(需要sudo权限) sudo sh -c 'echo "export SYS_VAR=\"系统变量值\"" >> /etc/profile' sudo sh -c 'echo "export LD_LIBRARY_PATH=\"/lib路径\"" >> /etc/profile' # 库路径示例[^5] ``` **生效命令:** ```bash source /etc/profile # 立即生效 ``` --- #### 三、关键注意事项 1. **配置文件加载顺序**: - 系统级:`/etc/profile` → `/etc/bash.bashrc` - 用户级:`~/.bash_profile` → `~/.bashrc`[^2] ```mermaid graph LR A[登录Shell] --> B[/etc/profile] B --> C[~/.bash_profile] C --> D[~/.bashrc] D --> E[/etc/bash.bashrc] ``` 2. **特殊字符处理**: ```bash # 含空格的值需用引号 export SPACE_VAR="value with space" ``` 3. **PATH 变量追加**: ```bash # 正确方式:保留原PATH内容 echo 'export PATH="$PATH:/new/path"' >> ~/.bashrc ``` 4. **验证变量生效**: ```bash env | grep USER_VAR # 检查变量是否存在 echo $PATH # 检查PATH更新 ``` --- ### 典型应用场景 #### 案例1:添加Java环境变量[^5] ```bash #!/bin/bash JAVA_HOME="/usr/lib/jvm/java-11-openjdk" echo "export JAVA_HOME=\"$JAVA_HOME\"" >> ~/.bashrc echo 'export PATH="$JAVA_HOME/bin:$PATH"' >> ~/.bashrc source ~/.bashrc ``` #### 案例2:临时覆盖环境变量 ```bash #!/bin/bash # 仅在此脚本运行时修改 export TZ="Asia/Shanghai" date # 将使用北京时间 ``` --- ### 配置差异对比 | 配置方式 | 作用范围 | 持久性 | 配置文件 | 生效命令 | |---------------|----------------|----------|------------------|------------------| | `export` | 当前Shell | 临时 | 无 | 立即生效 | | `~/.bashrc` | 当前用户 | 永久 | 用户目录 | `source ~/.bashrc` | | `/etc/profile`| 所有用户 | 永久 | 系统目录 | `source /etc/profile` | | `~/.profile` | 图形界面登录 | 永久 | 用户目录[^3] | 重新登录 | > **最佳实践**:用户级变量建议放在`~/.bashrc`,系统级变量放`/etc/profile`,避免修改`~/.profile`可能导致的图形界面兼容问题[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值