所有的编程语言都利用变量来存放数据,以备随后使用或修改。和编译型语言不同,大多数脚本语言不要求在创建变量之前声明其类型。用到什么类型就是什么类型。在变量名前面加上一个美元符号就可以访问到变量的值。shell定义了一些变量,用于保存用到的配置信息,比如可用的打印机、搜索路径等。这些变量叫作环境变量。
Shell 使用变量与环境变量 预备知识
变量名由一系列字母、数字和下划线组成,其中不包含空白字符。常用的惯例是在脚本中使用大写字母命名环境变量,使用驼峰命名法或小写字母命名其他变量。
所有的应用程序和脚本都可以访问环境变量。可以使用env
或printenv
命令查看当前shell中所定义的全部环境变量:
$> env
PWD=/home/clif/ShellCookBook
HOME=/home/clif
SHELL=/bin/bash
# …… 其他行
要查看其他进程的环境变量,可以使用如下命令:
cat /proc/$PID/environ
其中,PID
是相关进程的进程ID(PID
是一个整数)。
假设有一个叫作gedit的应用程序正在运行。我们可以使用pgrep
命令获得gedit的进程ID:
$ pgrep gedit
12501
那么,你就可以执行以下命令来查看与该进程相关的环境变量:
$ cat /proc/12501/environ
GDM_KEYBOARD_LAYOUT=usGNOME_KEYRING_PID=1560USER=slynuxHOME=/home/slynux
注意,实际输出的环境变量远不止这些,只是考虑到页面篇幅的限制,这里删除了不少内容。
特殊文件/proc/PID/environ是一个包含环境变量以及对应变量值的列表。每一个变量以name=value
的形式来描述,彼此之间由null字符(\0
)分隔。形式上确实不太易读。
要想生成一份易读的报表,可以将cat
命令的输出通过管道传给tr
,将其中的\0
替换成\n
:
$ cat /proc/12501/environ | tr '\0' '\n'
Shell 使用变量与环境变量 实战演练
可以使用等号操作符为变量赋值:
varName=value
varName
是变量名,value
是赋给变量的值。如果value
不包含任何空白字符(例如空格),那么就不需要将其放入引号中,否则必须使用单引号或双引号。
注意,
var = value
不同于var=value
。把var=value
写成var = value
是一个常见的错误。两边没有空格的等号是赋值操作符,加上空格的等号表示的是等量关系测试。
在变量名之前加上美元符号($
)就可以访问变量的内容。
var="value" #将"value"赋给变量var
echo $var
也可以这样写:
echo ${var}
输出如下:
value
我们可以在printf
、echo
或其他命令的双引号中引用变量值:
#!/bin/bash
#文件名:variables.sh
fruit=apple
count=5
echo "We have count{fruit}(s)"
输出如下:
We have 5 apple(s)
因为shell使用空白字符来分隔单词,所以我们需要加上一对花括号来告诉shell这里的变量名是fruit
,而不是fruit(s)
。
环境变量是从父进程中继承而来的变量。例如环境变量HTTP_PROXY
,它定义了Internet连接应该使用哪个代理服务器。
该环境变量通常被设置成:
HTTP_PROXY=192.168.1.23:3128
export HTTP_PROXY
export
命令声明了将由子进程所继承的一个或多个变量。这些变量被导出后,当前shell脚本所执行的任何应用程序都会获得这个变量。shell创建并用到了很多标准环境变量,我们也可以导出自己的环境变量。
例如,PATH
变量列出了一系列可供shell搜索特定应用程序的目录。一个典型的PATH
变量包含如下内容:
$ echo $PATH
/home/slynux/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
各目录路径之间以:
分隔。$PATH
通常定义在/etc/environment、/etc/profile或~/.bashrc中。
如果需要在PATH
中添加一条新路径,可以使用如下命令:
export PATH="$PATH:/home/user/bin"
也可以使用
$ PATH="$PATH:/home/user/bin"
$ export PATH
$ echo $PATH
/home/slynux/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/user/bin
这样,我们就将/home/user/bin添加到了PATH
中。
另外还有一些众所周知的环境变量:HOME
、PWD
、USER
、UID
、SHELL
等。
使用单引号时,变量不会被扩展(expand),仍依照原样显示。这意味着
$ echo '$var'
会显示$var
。
但如果变量$var
已经定义过,那么$ echo "$var"
会显示出该变量的值;如果没有定义过,则什么都不显示。
Shell 使用变量与环境变量 补充内容
shell还有很多内建特性。下面就是其中一些。
1. 获得字符串的长度
可以用下面的方法获得变量值的长度:
length=${#var}
考虑这个例子:
$ var=12345678901234567890
$ echo ${#var}
20
length
就是字符串所包含的字符数。
2. 识别当前所使用的shell
可以通过环境变量SHELL
获知当前使用的是哪种shell:
echo $SHELL
也可以用
echo $0
例如:
$ echo $0
/bin/bash
3.检查是否为超级用户
环境变量UID
中保存的是用户ID。它可以用于检查当前脚本是以root用户还是以普通用户的身份运行的。例如:
If [ $UID -ne 0 ]; then
echo Non root user. Please run as root.
else
echo Root user
fi
注意,[
实际上是一个命令,必须将其与剩余的字符串用空格隔开。上面的脚本也可以写成:
If test $UID -ne 0:1
then
echo Non root user. Please run as root.
else
echo Root user
fi
root用户的UID
是0
。
4.修改Bash的提示字符串(username@hostname:~$
)
当我们打开终端或是运行shell时,会看到类似于user@hostname:/home/$
的提示字符串。不同的GNU/Linux发布版中的提示字符串及颜色各不相同。我们可以利用PS1
环境变量来定义主提示字符串。默认的提示字符串是在文件~/.bashrc中的某一行设置的。
– 查看设置变量PS1
的那一行:
$ cat ~/.bashrc | grep PS1PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
- 如果要修改提示字符串,可以输入:
slynux@localhost: ~$ PS1="PROMPT>" #提示字符串已经改变PROMPT> Type commands here.
- 我们可以利用类似于
\e[1;31
的特定转义序列来设置彩色的提示字符串(参考1.2节的内容)。
还有一些特殊的字符可以扩展成系统参数。例如:\u
可以扩展为用户名,\h
可以扩展为主机名,而\w
可以扩展为当前工作目录。