[TOC] ## 常见变量 * `BASHPID`:Bash 进程的进程 ID。 * `BASHOPTS`:当前 Shell 的参数,可以用`shopt`命令修改。 * `DISPLAY`:图形环境的显示器名字,通常是`:0`,表示 X Server 的第一个显示器。 * `EDITOR`:默认的文本编辑器。 * `HOME`:用户的主目录。 * `HOST`:当前主机的名称。 * `IFS`:词与词之间的分隔符,默认为空格。 * `LANG`:字符集以及语言编码,比如`zh_CN.UTF-8`。 * `PATH`:由冒号分开的目录列表,当输入可执行程序名后,会搜索这个目录列表。 * `PS1`:Shell 提示符。 * `PS2`: 输入多行命令时,次要的 Shell 提示符。 * `PWD`:当前工作目录。 * `RANDOM`:返回一个0到32767之间的随机数。 * `SHELL`:Shell 的名字。 * `SHELLOPTS`:启动当前 Shell 的`set`命令的参数,参见《set 命令》一章。 * `TERM`:终端类型名,即终端仿真器所用的协议。 * `UID`:当前用户的 ID 编号。 * `USER`:当前用户的用户名。 ## set `set`命令可以显示所有变量,包括环境变量和自定义变量 ## 创建变量 ``` a=z # 变量 a 赋值为字符串 z b="a string" # 包含空格,就必须放在引号里面 c="a string and $b" # 变量值可以引用其他变量的值 d="\t\ta string\n" # 变量值可以使用转义字符 e=$(ls -l foo.txt) # 变量值可以是命令的执行结果 f=$((5 * 7)) # 变量值可以是数学运算的结果 ``` ## 读取变量 如果变量不存在,Bash** 不会报错**,而会输出空字符 进行转义 ``` echo The total is \$100.00 ``` 如果变量的值本身也是变量,可以使用`${!varname}`的语法 ``` $ myvar=USER $ echo ${!myvar} idcpj ``` ## 删除变量 ``` // unset 也是把值变为 空字符 unset NAME // or 推荐 $ foo='' $ foo= ``` ## 输出变量,export 命令 子 Shell 默认读取不到父 Shell 定义的变量,可使用 export ``` NAME=foo export NAME //or export NAME=foo ``` ## 变量的默认值 ``` ${varname:-word} //varname 不存在 返回 word ${varname:=word} // 设置为 word, 并返回word ${count:+1} // 变量存在且不为空,返回1,否则返回空(用于检测变量是否存在) ``` ## 特殊变量 ### $? `$?`为上一个命令的退出码,用来判断上一个命令是否执行成功。返回值是`0`,表示上一个命令执行成功;如果是非零,上一个命令执行失败 ### $$ `$$`为当前 Shell 的进程 ID ``` $ echo $$ 10662 ``` 这个特殊变量可以用来命名临时文件。 ``` LOGFILE=/tmp/output_log.$$ ``` ### $_ `$_`为上一个命令的最后一个参数。 ``` $ grep dictionary /usr/share/dict/words dictionary $ echo $_ /usr/share/dict/words ``` ### $! $!为最近一个后台执行的异步命令的进程 ID。 ``` $ firefox & [1] 11064 $ echo $! 11064 ``` ### $0 $0为当前 Shell 的名称(在命令行直接执行时)或者脚本名(在脚本中执行时) ``` $ echo $0 bash ``` ## declare 命令 ``` declare OPTION VARIABLE=value OPTION -a:声明数组变量。 -f:输出所有函数定义。 -F:输出所有函数名。 -i:声明整数变量,可直接运算 result=val1*val2。 -l:声明变量为小写字母。 -p:查看变量信息。 -r:声明只读变量。 -u:声明变量为大写字母。 -x:该变量输出为环境变量 ``` ## readonly 命令 同 `declare -r` ## let 命令 ``` $ let foo=1+2 $ echo $foo 3 $ let "v1 = 1" "v2 = v1++" $ echo $v1,$v2 2,1 ```