变量:内存中的某个存储单元
程序中的变量a,就是指用a命名的某个存储单元,用户对变量a进行的操作就是对该存储单元进行的操作;系统根据其类型为决定存储机制和存储空间大小,变量的地址就是内存空间中的地址。
bash shell的变量类别:
- 本地变量
只对当前shell进程有效的变量;对其它shell无效,包括当前shell的子进程。
例如:init --> xxx --> bash --> bash (pstree查看进程树)在上一个bash shell(父shell)中定义一个变量: name = A,在子shell查看name: echo &name,结果为空。
变量赋值/定义:VAR_NAME=VALUE
变量引用:${VAR_NAME} (’{}'大多数情况下可以省略)
强引用 [单引号 ‘’]:里面的变量会被替换
弱引用 [双引号 “”]:里面所有的字符都是字面常量,直接输出
name = A
echo '$name' #输出 $name
echo "$name" #输出 A
- 环境变量
对当前shell进程有效及其子shell有效的变量。
功能 | 命令 |
---|---|
定义环境变量 | export VAR_NAME=VALUE |
撤消环境变量 | unset VAR_NAME(虽然shell退出时,会回收变量,但提前撤消可节约内存空间) |
只读环境变量 | readonly VAR_NAME |
显示环境变量HOME | echo $HOME |
显示所有的环境变量 | env |
显示所有本地定义的Shell变量 | set |
/etc/profile增加新的环境变量 | export path=$path:/path1:/path2:/pahtN |
- 局部变量
对shell脚本中某代码片断有效;通常用于函数中,函数调用结束,其随之消失。
定义局部变量:local VAR_NAME=VALUE
- 位置变量
$1,$2,…, ${10} 常用于表示脚本命令中选项的位置,如: ls -l /etc/profile 其中$1表示参数[-l]的位置,第1个参数的位置。表示超过两位数的参数时,使用大括号限定起来。
- 特殊变量
$?,表示特殊意义的变量。
参数标识符 | 含义 |
---|---|
$0 | 文件本身的名字 |
$# | 参数的个数 |
$* | 所有参数列表。如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 |
$@ | 所有参数列表。如"$@“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 |
$$ | Shell本身的PID(ProcessID) |
$! | Shell最后运行的后台Process的PID |
$? | 最后运行的命令的结束代码(返回值) |
bash的配置文件
- profile类
为交互式登录shell的用户提供配置。如:通过终端输入账号和密码登录 --login;使用su -l USERNAME 或 su - USERNAME;
- 全局(对所有用户)生效的配置文件:
/etc/profile
/etc/profile.d/*.sh - 仅对当前用户生效的配置文件:
~/.bash_profile - 作用:
1、设定环境变量
2、运行命令或脚本
- bashrc类
为非交互式的用户提供配置。如执行脚本;su USERNAME;图形界面下打开的终端。
- 全局(对所有用户)生效的配置文件:
/etc/bashrc - 仅对当前用户生效的配置文件:
~/.bashrc - 作用:
1、设定本地变量
2、定义命令别名
Notice:
如何通过编辑配置文件让修改的配置生效?
1、退出并重新登录;
2、让bash重读此文件; . filename 或者 source filename
交互式登录的用户配置文件读写次序:
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登录的用户配置文件读写次序:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
越先读取,越有可能被覆盖。越后读取,越有可能是最终生效的。交互式登录的用户也会读取非交互式用户下的配置文件。非交互式登录的用户也会读取/etc/profile.d/*.sh,不是完全的泾渭分明。
- 交互式shell和非交互式shell
交互式模式:就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。
这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了。
非交互式模式模式:以shell script(非交互)方式执行。
在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾EOF,shell也就终止了。
- 登录shell和非登录shell
登录shell:是需要用户名、密码登录后才能进入的shell(或者通过"–login"选项生成的shell)。
非登录shell:当然就不需要输入用户名和密码即可打开的Shell。
例如:直接命令“bash”就是打开一个新的非登录shell,在Gnome或KDE中打开一个“终端”(terminal)窗口程序也是一个非登录shell。
执行exit命令,退出一个shell(登录或非登录shell);
执行logout命令,退出登录shell(不能退出非登录shell)。
bash是 login shell 时,其进程名为”-bash“ 而不是”bash”。
[perf@host_220-188 ~]$ echo $0
-bash