Linux shell程序设计(五).变量-3
OK,变量问题的最后扫尾,包括了与变量相关的一些知识,不过也是重要的。
八、环境文件
bash的环境文件包括:.bash_profile文件、.bashrc文件、.bash_logout文件等
.bash_profile:设置化境变量和文件掩码(umask),注册后执行
.bashrc:只含有针对bash的脚本,可以用来设置别名,在.bash_profile之后执行
.bash_logout:退出注册是执行,例如清屏等操作
注:若是C shell,则相应文件为.login
九、export语句与环境设置
1、export语句
在脚本或命令行中定义的变量(包括环境变量),仅在同一shell下有效,例如:
$ string="XXXX"
$ cat ex11
echo "the name is $string"
$ ./ex11
the name is
$ echo $string
the name is XXXX
可以看到,上面的例子中,定义的string变量仅在当前的shell下有效,而在ex11环境下为空。
export命令的作用就是将私有的变量export到转出区
export [变量名]
例如:
$ name="AAA"
$ export name
$ cat ex12
name="BBB"
echo "His name is $name"
ex13
$ cat ex13
echo "Her name is $name"
$ ./ex12
His name is BBB
Her name is AAA
注:export在同一命令行中可以对应多个变量,例如:
$ export TERM PATH SHELL HOME
2、环境变量的设置和显示
直接设置变量的形式为:
[变量名]=值
注意:如果含有空格等特殊字符,用""括起来
可以使用不带参数的export命令显示本进程利用export命令所输出的全部变量
$ export
declare -x HOME="/home/oracle"
declare -x HOSTNAME="localhost.localdomain"
declare -x INPUTRC="/etc/inputrc"
declare -x LANG="en_US.UTF-8"
declare -x PWD="/home/oracle"
declare -x SHELL="/bin/bash"
declare -x SHLVL="2"
declare -x SSH_ASKPASS="/usr/libexec/openssh/gnome-ssh-askpass"
declare -x SSH_CLIENT="::ffff:192.168.63.1 1474 22"
declare -x SSH_CONNECTION="::ffff:192.168.63.1 1474 ::ffff:192.168.63.3 22"
declare -x SSH_TTY="/dev/pts/1"
declare -x TERM="vt100"
... ...
也可以使用env命令列出所有的化境变量(包括本进程和以前进程所输出的变量)
$ env
MAIL=/var/spool/mail/root
PWD=/home/oracle
INPUTRC=/etc/inputrc
LANG=en_US.UTF-8
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
HOME=/home/oracle
SHLVL=2
LOGNAME=oracle
SSH_CONNECTION=::ffff:192.168.63.1 1474 ::ffff:192.168.63.3 22
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
OLDPWD=/root
... ...
3、set命令
set命令的功能有三个:
① 显示迄今为止所有定义的变量,包括局部变量和公用变量
② 设定位置参数的值
③ 改变执行shell脚本时的选项设定
功能①即使用不带参数的set命令
功能②见上文
功能③说明如下:
设置标志:set -标志
关闭标志:set +标志
标志说明:
-x:命令打印,并在前面加“+”
-v:所有命令均打印出来
-a:对被修改、创建的变量自动标记,表明要被export到后继名命令的环境中
-e:命令以非0状态终止时退出shell(循环/if语句除外)
-f:禁止路径名扩展
-h:记住命令位置,便于查找(默认打开)
-k:把全部以赋值语句形式出现的参数放在命令的环境中
-n:读命令,但不执行
十、参数置换变量
参数置换变量是另一种为参数复制的方式,形式为:
[变量2]=${[变量1]op[字符串]} op in
[ :- | := | :+ | :? ]
注:op两边不能有空格
1、[变量2]=${[变量1]:-[字符串]}
如果[变量1]为空,则[变量2]=[字符串],[变量1]不变;否则[变量2]=[变量1],[变量1]不变
举例:
$ cat ex15
echo -n "Please enter TERM1(default is ansi)->"
read terminal
TERM1=${ terminal:-ansi }
echo "terminal type is $TERM1 now."
echo "terminal=$terminal"
$ ./ex15
Please enter TERM1(default is ansi)->(按Enter键)
terminal type is ansi now.
terminal=
$ ./ex15
Please enter TERM1(default is ansi)->(vt100 按Enter键)
terminal type is vt100 now.
terminal=vt100
2、[变量2]=${[变量1]:=[字符串]}
如果[变量1]为空,则[变量2]=[字符串],[变量1]=[字符串];否则[变量2]=[变量1],[变量1]不变
举例:
$ cat ex16
echo -n "Please enter TERM2(default is ansi)->"
read terminal
TERM2=${ terminal:=ansi }
echo "TERM2=${TERMS2}***terminal=$terminal"
$ ./ex16
Please enter TERM2(default is ansi)->(按Enter键)
TERM2=ansi***terminal=ansi
$ ./ex16
Please enter TERM2(default is ansi)->(vt100 按Enter键)
TERM2=vt100***terminal=vt100
3、[变量2]=${[变量1]:+[字符串]}
如果[变量1]为空,则[变量2]为空,[变量1]不变;否则[变量2]=[字符串],[变量1]不变
举例:
$ cat ex17
echo -n "Please enter TERM3(default is ansi)->"
read terminal
TERM3=${ terminal:+ansi }
echo "TERM3=${TERMS3}!!!terminal=$terminal"
$ ./ex17
Please enter TERM3(default is ansi)->(按Enter键)
TERM3=!!!terminal=
$ ./ex17
Please enter TERM3(default is ansi)->(vt100 按Enter键)
TERM3=ansi!!!terminal=vt100
4、[变量2]=${[变量1]:?[字符串]}
如果[变量1]为空,则输出 “[shell脚本名]:[变量1]:[字符串]”;否则[变量2]=[变量1],[变量1]不变
举例:
$ cat ex18
echo -n "Please enter TERM4(default is ansi)->"
read terminal
TERM4=${ terminal:+ansi }
echo "TERM4=${TERMS4}\$\$\$terminal=$terminal"
$ ./ex18
Please enter TERM4(default is ansi)->(按Enter键)
ex18:terminal:ansi
$ ./ex18
Please enter TERM3(default is ansi)->(vt100 按Enter键)
TERM3=ansi$$$terminal=vt100
注:显示的[变量1]是其名称,而不是它的值。