shell定义了一些变量,用于保存用到的配置信息,比如可用的打印机、搜索路径等,这些变量叫做环境变量。
1.3.1预备知识
惯例用大写字母命名环境变量,用驼峰命名法或小写字母命名其他变量。
所有的应用程序和脚本都可以访问环境变量,可以使用env或者printenv查看当前shell中定义的全部环境变量:
要查看其他进程的变量用以下命令
cat /proc/$PID/environ
PID是相关进程的ID
用pgrep可以获得进程的id
特殊文件/proc/PID/environ是一个包涵环境变量以及对应变量值的列表。每个变量以name=value来描述,彼此之间用null字符(\0)来分隔。
想要生成一份易读的报表可以将cat命令的输出通过管道传给tr,将其中的\0替换成\n:
cat /proc/12501/environ | tr '\0' '\n'
1.3.2实战演练
可以用等号为变量赋值:varName=value varName是变量名,value是赋值给变量的值。如果value不包含任何空白字符(例如空格)那么就不需要将其放入引号中,否则必须用单引号或双引号。
var = value 和var=value是不一样的。两边没有空格的等号是赋值操作,加上空格的等号表示等量关系测试。
在变量名之前加上美元符号($)就可以访问变量的内容。
var="value"
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是使用空白字符来分隔单词,所以我们需要加上一对花括号来告诉这里的变量是fruit而不是fruit(s)。
环境变量是从父进程中继承而来的变量。例如环境变量HTTP_PROXY,它定义了Internet连接该使用哪个代理服务器。
该环境变量通常被设置为:
HTTP_PROXY=192.168.1.23:3128
export HTTP_PROXY
export声明了将由子进程继承的一个或多个变量。这些变量被导出后,当前shell脚本所执行的任何应用程序都会获得这个变量。shell创建并用到了很多标准环境变量,我们也可以导出自己的环境变量。
例如一个PATH包
echo $PATH
/home/slynux/bin:/usr/local/sbin:/usr/local/bin:/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
这样就在PATH中添加了一个/home/user/bin
还有一些众所周知的环境变量:HOME 、PWD、USER、UID、SHELL
1.3.3补充内容
1.获取字符串的长度
lenth=${#var}
举例:
var=12345678901234567890
echo ${#var}
20
2.识别当前所使用的shell
用echo $SHELL 或者echo $0
输出/bin/bash
用环境变量SHELL可以获取
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
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 PS1
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$'
修改提示字符串可以用:
slynux@localhost: ~$ PS1="PROMPT>"
PROMPT> Type commands here.
我们可以利用类似于\e[1;31的特定转义序列来设置彩色的提示字符串
还有一些特殊的字符可以扩展为系统参数。例如:\u可以扩展为用户名,\h可以扩展为主机名,\w可以扩展为当前工作目录