Shell 编程学习笔记

Shell 变量
(1). 设定变量 
   Shell变量没有数据型态,像JS变量一样,除非用内置命令declare声明其数据型态。所以SHELL变量不用声明即可使用。
默认情况下以字符串对待。SHELL变量的命名与C语言变量命名相同,并区分大小写。取得变量值用$varname,${varname}
两种方式。
例如(anran.sh):
   #! /bin/bash
   shopt -s -o nounset #表示变量必须设定过才能使用。(1)
   myname=guojianjun #设定变量myname            (2)
   #比较好的习惯,把字符串用单/双引号引起来“guojianjun”
   #=号两边不能有空格,如果右边值有空格,用引号引起来“guo jianjun”
   echo $myname 
   #或者${myname},如果后面还有字符串,数字,下画线,要用{}把变量括起来,否则无法定位变量,这里也就是说只要能
    定位变量就可以,如$myname/2,就工作的挺好。
   #如果同时#掉(1),(2),则报: ./anran.sh: line 6: myname: unbound variable
   #再者如果我们想显示$符号,可以用\或者''(不是双引号,否则会显示变量值,SHELL真能折腾):echo \$myname '$myname'。
除了用echo显示变量外,Bash还有一个printf(C语言的叛徒,不说它了,用到再联系)
(2).取消[回收内存空间]或清空变量[不回收内存空间]
   使用unset清除变量,-v 清除变量,-f清除函数,不加选择的话,尝试清除变量,或失败,再试着取消与之同名的涵数。
   如:unset -v myname.
  清空变量很简单 : myname= 赋空即可。
(3).以前说的变量都是本地变量,即在当前shell中有效。如在父shell中设定:myname=guojianjun 
  执行: 
     #! /bin/bash
     echo $myname
 输出为空。怎样才能使子SHELL可以使用它呢,设定为环境变理:export myname=guojianjun或者declare -x myname=guojianjun
(4).变量扩展
  1.语法:${var-defaultvalue}
  若变量存在,返回变量值,否则返回defaultvalue
  #! /bin/bash
  unset myname
  echo ${myname-anran}
  (以下用法都与1相同)。
  2.语法:${var:-defaultvalue}
   若变量存在且不为空,返回变量值,否则返回defaultvalue
  3.语法:${var:=defaultvalue}
   若变量存在且不为空,返回变量值,否则给变量设定defaultvalue,并返回变量值。
  4.语法:语法:${var:?erro}
     若变量存在且不为空,则继续执行,否则停止执行。
    #! /bin/bash
    fn=${1:?'请提供删除的目录'}
    echo $fn 
  5.语法: ${var:+真值}
    测试变量的存在性,若变量存在且不为空,则什传回真值[真值是非空字符串或数字],否则,传回空值。
  6.语法:${var:startIndex}
    从指定位置截取字符串到字符串结束.
  7.语法:${var:startIndex:length}
    从指定位置截取指定长度字符串.6,7与JAVA语言的SUBSTRING函数差不多。
   有一个特殊的用法${@:2} 由2起取得后面所有的位置参数,而不是字符串长度,${@:2:2}同理。
  8.语法:${#var}
     传回变量值的字符串长度。对比:取得数组元素个数:${#a[@]}/${#a[*]}
  9.语法:${var#style}
    从左边开始,将符合样式的字符串删除(饱汉式,即找到符合的即停止,导至删除最短的)。
    filename="/usr/share/opt"
    echo ${filename#/*/} #结果为share/opt
  10.语法:${var##style}
     同9,但是是饿汉式,所以删除最长的。按上列返回:opt
  11.语法:${var%style}
     同9,但是是从右边开始。
    filename="/usr/share/opt"
    echo ${filename#/*} #结果为/usr/share
  12.语法:${var%%style}
     同10,但是是从右边开始。按上列返回:
  13.语法:${var/style/replace}
     只替换第一个对比符合的字符串(取最长的)。如果没有replace,就变成的删除。
  14.语法:${var//style/replace}
    只替换全部对比符合的字符串(取最长的)。如果没有replace,就变成的删除。
  13~14中的style如果以#开头,则表示该样式出现在变量的开头,以%开头则样式要出现在变量的结尾。
   也符合了9,11一个从左边开始,一边从右边开始。SHELL有些地方还是通的。
(5).命令替换
    语法:varname=$(命令)
   也有这样写的:`命令`(难看)。
   bls=$(ls -l /)
   IFS='\n'
   echo $bls
(6).特殊参数

常用为$0,$1,$2。其中$0代表可执行文件名(不包括路径),$*代表全部参数(即$1 $2 ...),$1代表第一个参数,$2代表第二个参数,依次类推。

另外在脚本里的函数也同样有$0 $1这些特殊的变量。相同的是$0仍然代表文件名,不同的是$1...$n代表你调用该函数里传递的参数,即时变量声明时没有参数声明,比如:

Usage(){

  Echo $0,$1

}

调用Usage anran.

wait for next...


本文转自 anranran 51CTO博客,原文链接:http://blog.51cto.com/guojuanjun/294333


上一篇:安装android驱动解决device not found


下一篇:spark (java API) 在Intellij IDEA中开发并运行