1. 不同的执行方式,不同的shell环境
- 每次调用bash/sh解释器执行脚本都会开启一个子shell,因此不保留当前shell变量,通过
pstree
命令检查进程树 - 调用source是当前环境加载脚本,因此保留变量
例子:
xiao123@xiao123:~/Downloads$ echo "name=大西瓜" > make_vars.sh
xiao123@xiao123:~/Downloads$ cat make_vars.sh
name=大西瓜
xiao123@xiao123:~/Downloads$ chmod +x make_vars.sh
xiao123@xiao123:~/Downloads$ bash ./make_vars.sh
xiao123@xiao123:~/Downloads$ echo ${name}
xiao123@xiao123:~/Downloads$ echo $name
xiao123@xiao123:~/Downloads$ source ./make_vars.sh
xiao123@xiao123:~/Downloads$ echo ${name}
大西瓜
xiao123@xiao123:~/Downloads$ echo $name
大西瓜
xiao123@xiao123:~/Downloads$
2.shell变量面试题
问,如下输入什么内容
xiao123@xiao123:~/Downloads$ echo 'user1=`whoami`' > test.sh
xiao123@xiao123:~/Downloads$ cat test.sh
user1=`whoami`
xiao123@xiao123:~/Downloads$ sh test.sh
xiao123@xiao123:~/Downloads$ echo $user1
A.当前用户
B.超哥
C.空
答案:C
环境变量设置
环境变量一般指的是用export内置命令导出的变量,用于定义shell的运行环境、保证shell命令的正确执行。
shell通过环境变量确定登录的用户名、PATH路径、文件系统等各种应用。
环境变量可以在命令行中临时创建,但是用户推出shell终端,变量即丢失,如要永久生效,需要修改环境变量配置文件。
- 用户个人配置文件
~/.bash_profile
、~/.bashrc
远程登陆用户特有文件 - 全局配置文件
/etc/profile
、/etc/bashrc
,且系统建议最好创建在/etc/profile.d/
,而非直接修改主文件,修改全局配置文件,影响所有登录系统的用户。
检查系统环境变量的命令
- set,输出所有变量,包括全局变量、局部变量
- env,只显示全局变量
- declare,输出所有变量,如同set
- export,显示和设置环境变量值
撤销环境变量
- unset 变量名,删除变量或函数
设置只读变量
- readonly,只有shell结束,只读变量失效
xiao123@xiao123:~/Downloads$ readonly name='xiao'
xiao123@xiao123:~/Downloads$ name=123
-bash: name: readonly variable
xiao123@xiao123:~/Downloads$
环境变量初始化于加载顺序
- shell登录Linux后,系统启动一个bash,shell bash会读取若干个系统环境文件,检查环境变量设置。
- /etc/profile:全局环境变量文件;为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,并从/etc/profile.d目录的配置文件中搜集shell的设置。
- 然后读取/etc/profile.d目录下的脚本,有系统诸多脚本,也放入自定义需要登录加载的脚本,便于用于登录后立即运行脚本。
- 运行$HOME/.bash_profile(用户环境变量文件)。
- 运行$HOME/.bashrc。
- 等等
- 运行/etc/bashrc。
注意:
1.每个用户都有自己的环境变量配置文件,~/.bash_profile ~/.bashrc,且以个人配置文件优先加载变量,读取,以个人优先生效。
2.当你需要给所有用户都是用某个变量,写入全局即可/etc/profile。
set 命令
set
命令能够找到当前的shell环境中的所有变量,以及包括局部变量(sh脚本文件中定义的变量)
展示:
env命令
env
命令输出当前shell环境中的全局变量。
展示:
declare 命令
declare
命令等同于set
命令。
展示:
定义变量值为大小写
xiao123@xiao123:~/Downloads/shscripts$ cat declare_test.sh
#!/bin/bash
declare -l lower
declare -u upper
lower="QWERTYui"
upper="ASDFGHjk"
echo "lower: ${lower}"
echo "upper: ${upper}"
xiao123@xiao123:~/Downloads/shscripts$ ./declare_test.sh
lower: qwertyui
upper: ASDFGHJK
xiao123@xiao123:~/Downloads/shscripts$
export命令
export
查找和设置环境变量的值。
展示:
unset命令
unset
删除撤销一个变量。
readonly命令
readonly
声明变量只读,当前shell结束,该变量只读就失效。
找出当前系统中的环境变量
bash多行命令执行
xiao123@xiao123:~/Downloads$ ls;cd ../;cd -;ls;
make_vars.sh test.sh
/home/xiao123/Downloads
make_vars.sh test.sh
xiao123@xiao123:~/Downloads$