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]是其名称,而不是它的值。