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