-shell 变量的定义:

- 变量的定义:
定义的时候变量名与变量之间不能存在空格。

- 变量的使用:
获取一个已经定义好的变量的值,只需要在变量的名字前加$;例:

line="Hello world"
echo $line

-shell 变量的类型:

- 全局变量(环境变量):
在Linux中,内置了一些环境变量,如HOME,PATH,SHELL,UID,GID,HOSTNAME等,可以通过命令env显示所有的环境变量。

- 定义全局变量(环境变量):
(1)export 变量名=value;(最常用)
(2)变量名=value; export 变量名
(2)declare -x 变量名=value

  • 定义全局变量:例:
export NAME=ideal
  • 显示全局变量:例:
echo $NAME
ideal
  • 显示所有全局变量:例:
利用env,显示所有的环境变量。 
LC_PAPER=zh_CN.UTF-8 
XDG_VTNR=7 
LC_ADDRESS=zh_CN.UTF-8 
XDG_SESSION_ID=c2 
TERM_PROGRAM=vscode 
LC_MONETARY=zh_CN.UTF-8
  • 消除全局变量:例:
unset NAME
echo $NAME

- 局部变量(本地变量):
局部变量一般定义在脚本或命令行,只在当前shell有效。

- 只读变量 readonly:
在变量的前面 添加readonly把变量定义为一个只能读取的变量,无法进行修改。

-本地变量和环境变量的区别:

1.本质区别:在fork产生子进程时,父进程不会将本地变量传递给子进程,而环境变量(export)会传递;但是是父进程将环境变量传递给子进程是单向传递,子进程对环境变量的修改不会在传回给父进程(因为 环境变量的信息保存在进程内存空间,子进程退出后,内存被释放);另外需要注意的是:在当前bash中,通过
sudo -s
su -
su -l user
等方式切换其他用户而启动子进程,我猜测新的bash进程会重新加载相关用户的.bashrc .profile等配置信息,而导致父进程的环境变量被重新覆盖!!!
2.环境变量(export)会记录在env,export命令的结果中,而本地变量则不会,所有的当前bash的变量(包括本地变量)都可以使用set命令和declare命令得到(这四个命令都不加参数的情况下)

-关于shell环境和变量生存期,有以下结论:

1、执行脚本时,脚本中的语句是在一个子shell环境中运行的,脚本执行完后该子shell自动退出;
2、一个shell中的系统环境变量才会被复制到子shell中(用export定义的变量);
3、一个 shell中的系统环境变量只对该shell或者它的子shell有效,该shell结束时变量消失(并不能返回到父shell中);
3、不用 export定义的变量只对该shell有效,对子shell也是无效的。
4、用source执行一个脚本,相当于在当前Shell环境下执行该脚本中的语句,并没有父子的关系。
(使用source执行shell脚本不会启动新的进程,而是在当前shell进程执行)

作者:psvoldemort