Who am I

我的照片
Hefei, Anhui, China
Research Fields: Satellite Geodesy

2012年2月7日星期二

shell变量

变量赋值、引用
变量的赋值,如val1=2
引用变量值,如echo $val1。然而有时这样的引用同其它字符放在一起会产生错误,如echo $val1nd,原本想显示2nd,但实际是程序寻找val1nd这个变量。为了避免这样的错误,可以用{}将变量名括起来,此时echo ${val1}nd,即可正确显示2nd.



变量扩展
如a=bcd, x=efg
echo ${a}.b     显示结果为bcd.b
echo ${a}.php   显示结果为bcd.php
echo ${a}%b     显示结果为bcd%b
echo /$a/bc     显示结果为/bcd/bc
对于shell中的meta字符,需要用\进行转义,如
echo $a\*b      显示结果为bcd*b
c=$a$x; echo $c 显示结果为bcdefg
d=$c.ghi        显示结果为bcdefg.ghi



提取变量的部分内容
例:file=/dir1/dir2/dir3/my.file.txt
以下用${}分别替换获得不同的值
${file#*/}  从file左边字符开始,删除字符直到第一个/ dir1/dir2/dir3/my.file.txt
${file##*/} 从file左边字符开始,删除字符直到最后一个/ my.file.txt
${file#*.}  从file左边字符开始,删除字符直到第一个”.” file.txt
${file##*.} 从file左边字符开始,删除字符直到最后一个”.” txt
${file%/*}  从file右边字符开始,删除字符直到第一个/ /dir2/dir3
${file%%/*} 从file右边字符开始,删除字符直到最后一个/ 空值
${file%.*}  从file右边字符开始,删除字符直到第一个”.” /dir1/dir2/dir3/my.file
${file%%.*} 从file右边字符开始,删除字符直到最后一个”.” /dir1/dir2/dir3/my
其中:#表示删除字符直到第一个指定字符,##表示删除字符直到最后一个指定字符,*表示匹配任意字符,其中*可以用之前介绍的?,[character]等替代,如:
${file#????}          1/dir2/dir3/my.file.txt
${file#*[0-9]}        /dir2/dir3/my.file.txt
${file#dir1/dir[0-9]} /dir3/my.file.txt
根据字符串变量的index进行编辑,index从0开始编号,例如:
${file:0:5} 从编号为0的字符开始,提取file变量5个字符  /dir1
${file:5:5} 从编号为5的字符开始,提取file变量5个字符  /dir2
${file:5}   从编号为5的字符开始,提取file变量剩余字符 /dir2/dir3/my.file.txt
以上的变量扩展或提取,都并没有改变变量值的本身,只是在某次使用变量的过程中,对其进行的编辑。以下,将进一步介绍变量的替换。


变量字符串替换
${file/dir/path}   将file变量的第一个dir替换为path    /path1/dir2/dir3/my.file.txt
${file//dir/path}  将file变量所有dir替换为path       /path1/path2/ path 3/my.file.txt


变量替换
${#file} 计算出file变量的长度, 返回值为27


${varname:-word} 如果变量varname存在且非空,返回其本身的值;否则,返回word
${varname-word} 如果变量varname存在,则返回其值;否则,返回word
例:var=””, var1=”John”
echo ${var:-“hello”} hello
echo ${var-“hello”} 空值
unset var; echo ${var-“hello”} hello
echo hello${var1:-Jim} hello John


${varname:=word} 如果变量存在且非空,返回其值;否则,设置它为word,并返回word
${varname=word} 如果变量存在,返回其值;否则,设置它为word,并返回word
var=””
echo ${var:=”hello”}    hello
echo ${var}              hello
var=””
echo ${var=”hello”}     空值
echo ${var} 空值
unset var; echo ${var=”hello”} hello
echo ${var}        hello


${varname:+word} 如果变量varname存在且非空,则返回word;否则,返回空值
${varname+word} 如果变量varname存在,则返回word;否则,返回空值
var=””, var1=”John”
echo ${var:+”hello”} 空值
echo ${var+”hello”} hello
echo ${var} ${var1:+”Jim”} hello Jim
unset var; echo ${var+”hello”} 空值


${varname:?message} 如果变量存在且非空,返回其值;否则,打印varname:message;
${varname?message} 如果变量存在,返回其值;否则,打印varname:message;
var=””, var1=”hello”
echo ${var:?”var has not been set”} var:var has not been set
echo ${var1:?”var1 has not been set”} hello
echo ${var?”var is not exist”} 空值
unset var; echo ${var?”var is not exist”} var:var is not exist
这两条语句用于检查变量是否存在或被正常复制,否则将“message”输出到屏幕上,并终止程序


注:以上几种变量替换,只有”=”改变了原变量的值,其它的只是在当前语句中更改了变量值。为了方便记忆:=(没有才给你);-(没有才给你,只是表面上的);+(有了,才跟你换);?(有了,就不管你了;没有,输出提示信息)


命令替换
通过命令替换,一个命令的输出可以作为另一个命令的参数,或者存储到一个变量中(可以用于循环)。
命令替换有两种方法,一种是使用后引号``,另一种是用$(),后一种可能只适应bash
第一种方法:DATE=`date`; users=`who | wc -l`
第二种方法:echo last Sunday is $(date –d “last sunday”) 显示上一星期天的日期
例:通过$()实现对某目录下文件的操作
#!/bin/bash
j=$(ls $1)
for k in $j
do
   echo “$k”
   if [ $k=text ]; then
      cat $k
   else
      echo no text
   fi
done


整数运算替换
在bash中,$(())可以进行整数运算符号替换,大致支持:
+ - * / :分别为 "加、减、乘、除"。% :余数运算 ;& | ^ !:分别为 "AND、OR、XOR、NOT" 运算。
例:$ a=5; b=7; c=2
$ echo $(( a+b*c )) #得19
$ echo $(( (a+b)/c )) #得6
$ echo $(( (a*b)%c)) #得1
在 $(( )) 中的变量,可用 $ 符号来替换,也可以不用,如:$(( $a + $b * $c)) 也可得到 19 的结果。此外,$(( )) 还可作不同进位(如二进制、八进位、十六进制)作运算,只是,输出结果皆为十进制而已。echo $((16#2a)) 结果为 42 (16进位转十进制)
用 (( ))重定义变量值或作testing
a=5; ((a++)) 可将 $a 重定义为 6
a=5; ((a--)) 则为 a=4
a=5; b=7; ((a < b)) 会得到 0 (true) 的返回值。
常见的用于 (( )) 的测试符号有如下这些:
<:小于 ;>:大于 ;<=:小于或等于 ;>=:大于或等于 ;==:等于 ;!=:不等于
不过,使用 (( )) 作整数测试时,请不要跟 [ ] 的整数测试搞混乱了。

没有评论:

发表评论