Decode360's Blog

业精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

  BlogJava :: 首页 :: 新随笔 :: 联系 ::  :: 管理 ::
  397 随笔 :: 33 文章 :: 29 评论 :: 0 Trackbacks
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
 
 
 
posted on 2009-01-08 21:23 decode360 阅读(256) 评论(0)  编辑  收藏 所属分类: 03.Linux

只有注册用户登录后才能发表评论。


网站导航: