Who am I

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

2012年2月10日星期五

shell文件描述符


文件描述符是将一个数字和一个文件名相关联起来的机制,然后使用这个编号向该文件进行读写。有时,文件描述符又称为文件句柄。
标准输入(STDIN),0;标准输出(STDOUT),1;标准错误(STDERR),2
command n>file; command n>> file
标准输出重定向:command 1>file;command 1>>file
标准输入重定向:command 0<file;
command 1>file1 2>file2:将STDOUT重定向到file1,STDERR重定向到file2

exec绑定重定向
上面所讲的输入输出重定向只对当前的指令有效,当需要多次将输入输出重定向到一个文件时,可以利用exec命令。格式如下:
输出重定向:
exex n>file 或exec n>>file
这里n是一个整数,文件file是打开的需要写入的文件。例:exec 4>fd4.out   将fd4.out与文件描述符4相关联。
输入重定向:
exec n<file
将STDOUT和STDERR重定向到一个文件
command >file 2>&1

使用文件描述符
cmd >&n           把输出送到文件描述符n
cmd m>&n        把输出到文件描述符m的信息重定向到文件描述符n(如2>&1)
cmd >&-            关闭标准输出(等同于cmd 1>&-)
cmd n>&-          关闭标准输出文件描述符n
cmd <&n           输入来自文件描述符n
cmd m<&n        m来自文件描述符n
cmd <&-            关闭标准输入(等同于cmd 0<&-)
cmd n<&-          关闭输入文件描述符n
cmd <&n-          移动输入文件描述符n而非复制它
cmd >&n-          移动输出文件描述符n而非复制它

简单重定向补充
cmd <<< word  只把word和后面的换行作为输入提供给cmd(区别here document)
cmd <> file        以读写模式把文件file重定向到输入

举例说明
echo “11111” > a.txt 等同于echo “11111” 1>a.txt
>重定向到文件时,会将文件清空,再写入。
> 1.txt 等同于 :>1.txt   清空文件内容
( ls tank; pwd )&>1.txt        将错误信息,以及输出内容放到1.txt文件中
上述语句等同于( ls tank; pwd ) >1.txt 2>&1
<>用法举例:
echo 123456 >2.txt
exec 4<>2.txt         #打开2.txt并将内容读取到&4中
read –n 4 <&4        #从&4中读取4个字符
echo –n . >&4        #向&4中写入一个点
exec 4>&-             #关闭输出文件描述符4
        cat 2.txt                                    #结果为12345.6

2012年2月8日星期三

getopts语句


getopts语句的语法:
getopts option-string variable
其中option_string中包含一个有效的单字符选项。若getopts命令在命令行中发现了连字符,那么它将用连字符后面的字符同option_string相比较。若有匹配,则把变量variable的值设为该选项。若无匹配,则variable设为?。当getopts发现连字符后面没有字符,会返回一个非零的状态值。Shell程序中可以利用getopts的返回值建立一个循环。
getopts对命令行给出的选项进行分析,过程如下:
ü  getopts检查所有命令行参数,找到以”-”字符开头的字符;
ü  当找到以”-”字符开头的参数后,将跟在”-”字符后的字符与在option-string中给出的字符进行比较;
ü  若找到匹配,指定的变量variable被设置成选项,否则,variable被设置成”?”字符;
ü  重复上面三项,直到考虑完所有的选项;
ü  当分析结束后,getopts返回非零值并退出。

下面代码说明了date命令中怎么使用getopts命令处理各种选项,该程序除了完成unix的标准命令date的功能外,还增加了许多新的选项。
#newdate
if [ $# -lt 1 ]
;then 
date
else 
while getopts mdyDHMSTJjwahr OPTION
  do 
  case $OPTION in 
    m)date '+%m';;
      d)date '+%d';;
      y)date '+%y';;
      D)date '+%D';;
      H)date '+%H';;
      M)date '+%M';;
      S)date '+%S';;
      T)date '+%T';;
      j)date '+%j';;
      J)date '+%y%j';;
      w)date '+%w';;
      a)date '+%a';;
      h)date '+%h';;
      r)date '+%r';;
      \?)echo "无效的选项!$OPTION";;
    esac
  done
fi
$ newdate -J
  94031
$ newdate -a -h -d
  Mon
  Jan
  31
$ newdate -ahd
  Mon
  Jan
  31 

有时侯选项中还带一个值,getopts命令同样也支持这一功能。这时需要在 option_string中选项字母后加一个冒号。
当getopts命令发现冒号后,会从命令行该选项后读取该值。若该值存在,那么将被存在一个特殊的变量OPTARG中。额外参数和参数之间用空格隔开。如果该值不存在,getopts命令将在OPTARG中存放一个问号,并且在标准错误输出上显示一条消息。
下面的例子,实现拷贝一个文件,并给文件赋一个新的名字。-c选项指定程序拷贝的次数,-v选项要求显示新创建文件的文件名。
# Syntax: duplicate [-c integer] [-v] filename COPIES=1   
VERBOSE=N
while getopts vc:OPTION 
do 
  case $OPTION in
      c)COPIES=$OPTARG;;
      v)VERBOSE=Y;;
      \?)echo "无效参数!"
        exit 1;;
    esac
  done
  if [ $OPTIND -gt $# ]
  then
    echo "No file name specified"
     exit 2
  fi
  shift 'expr $OPTIND - 1'
  FILE=$1
  COPY=0
  while [ $COPIES -gt $COPY ]
  do
    COPY='expr $COPY + 1'
    cp $FILE $ {FILE} $ {COPY}
    if [ VERBOSE = Y }
    then
      echo ${FILE} $ {COPY}
    fi
  done 
   输出结果为:
$ duplicate -v fileA
 fileA1
 $ duplicate -c 3 -v fileB
 fileB1
 fileB2
 fileB3 

2012年2月7日星期二

GMT系列三 常用的绘图命令简介


  GMT常用的绘图命令简介
GMT是命令行形式的绘图软件,本章简单讲述GMT最常用的绘图命令。根据命令的作用,将常用的命令分成绘制地图、绘制点和线、绘制柱状图、绘制等高线图、绘制面状图以及重要的辅助命令这六类。

绘制底图
psbasemap     创建一个具有任意尺度的空的底图框架
pscoast          绘制海岸线、填充大陆、绘制河流和行政边界
pslegend         绘制legend

绘制点和线
pswiggle          沿(x,y)轨迹绘制空间、时间序列曲线
psxy                 在2D 图形中绘制符号、多边形和线
psxyz                在3D 图形中绘制符号、多边形和线

柱状图
pshistogram   绘制矩形柱状图
psrose              绘制极柱状图(扇形图/玫瑰花图)

等高线图
grdcontour     由2D 格网数据绘制等值线
pscontour       使用最佳三角形法直接由xyz数据绘制等值线或影像图

表面图
grdimage          由2D 格网数据绘制彩色影像图
grdvector         由2D 格网数据绘制矢量场
grdview           由2D 格网数据绘制3D 透视影像

重要的辅助命令
psclip             使用多边形文件初始化用户剪裁路径
psimage           绘制Sun 光栅图像文件
psmask            创建剪裁路径或覆盖模板
psscale             绘制灰度或彩色图例条
pstext               绘制文本

这些命令在绘制图形时,都可以接很多的参数,下一章我们先详细讲述最通用的十三个参数,最后,在后面的章节里会详细的讲解以上的每一个命令.

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) 的返回值。
常见的用于 (( )) 的测试符号有如下这些:
<:小于 ;>:大于 ;<=:小于或等于 ;>=:大于或等于 ;==:等于 ;!=:不等于
不过,使用 (( )) 作整数测试时,请不要跟 [ ] 的整数测试搞混乱了。

2012年2月3日星期五

GMT系列二 图形要素及其在GMT中的设置


图形要素及其在GMT中的设置

本章主要介绍了图形的主要元素,以及如何在GMT中设置这些元素的属性值。

图形要素
一个图形除了我们关注的主要内容之外,还有title, label, legend, tick, frame, text等众多辅助要素。一幅图形的视觉效果很大程度上取决于这些辅助要素的设置。首先让我们通过几幅图形认识这些辅助的图形因素。



通过以上几幅图,我们大概认识了这些辅助的图形要素。但是,这些图形要素看起来还是显得有些凌乱,下面首先对这些元素进行简单的一个归类(按照从上到下、从外到内的顺序)。
PAGER: 包含COLOR, ORIENTATION和MEDIA属性。
HEADER(title): 包含FONT, FONTSIZE和OFFSET属性。
LABEL: 包含FONT, FONTSIZE和OFFSET属性。
ANNOT:有时一幅图包含主、辅两个ANNOT。每个ANNOT都包含FONT, FONT_SIZE和OFFSET属性。此外,ANNOT还有MIN_SPACING和MIN_ANGLE两个属性。
FRAME: 包含PEN和WIDTH两个属性。
TICK: 包含LENGTH和PEN两个属性。
GRID: 也有主、辅两个格网类型。每个GRID都有PEN和CROSS_SIZE两个属性。
此外,还有一些时间和角度符号格式的设置。暂且把这一类称为FORMAT。
FORMAT: CLOCK, DATE, DEGREE这些项的FORMAT格式通常需要根据实际绘图需要进行设置。
以上是一些基本的图形要素,还有其它的一些要素,这里不一一阐述。下面会讲述如何查看和修改这些图形要素及其属性值。

GMT绘图单位
GMT常用的绘图单位有4 个,cm, inch, meter, point。通常有两种方法设定绘图单位,第一种是在参数后面显式地进行设置,如-X4i,图形的X轴向右移动4i。第二种方法是在GMT的defaults4文件里修改MEASURE_UNIT单位。关于如何修改属性值,下面将详细论述。

GMT默认属性值
GMT有100多个参数可以影响图像的显示效果,这些参数值存储在.gmtdefaults4文件里。当gmt程序启动时,首先会在当前目录下查找.gmtdefaults4文件,如果没有找到该文件,程序会到主目录或~/.gmt目录下查找.gmtdefaults4文件。建议在每个绘图任务的文件夹下都放置一个.gmtdefaults4文件,使用下面的命令完成。
gmtdefaults –D > ./.gmtdefaults4
将默认文件放在当前目录下,此时即可方便的查看默认属性值了。vim .gmtdefaults4

更改GMT属性值
这里介绍几种常用的更改gmt属性值的方法。第一种方式就是在命令参数后显式地进行更改,如-W1.5p;第二种方式是用gmtset命令,利用gmtset命令更改后的属性值将一直起作用,直到再次更改;第三种方法是直接打开.gmtdefaults4文件,直接修改文件里的内容(不推荐)。
例:gmtset ANNOT_FONT_PRIMARY  Times-Bold
回过头来看看第一章中的例子,即可明白前面两条命令的意思了。


GMT系列一 GMT简介

GMT简介
GMT是什么?
GMT是一款地学绘图软件,由美国哥伦比亚大学地球观测所的两名研究生Paul Wessel和Walter H. F. Smith于1987年创立。后经不断发展与改进,现在该软件已经在地理、地球物理等学科中得到广泛应用。

GMT能做什么?
GMT的主要功能是在各种各样的地图上绘制地震、等高线、地形图等等,当然一般的线性函数或对数、指数函数图都可以绘制。此外该软件还提供了大量的预处理和分析功能,能对数据进行滤波、拟合、内插等工作,不同数据间的格式进行转换,还可进行简单的数学分析甚至谱分析等等。

为什么GMT如此普及?
价格决定一切。GMT是一款完全免费的自由软件,任何用户都可以免费得到它。GMT可以搭载各种操作系统平台上,无论是windows用户还是unix用户都可以安装该软件。此外,高质量的PostScript输出也是众多用户喜欢的原因之一。

GMT的安装(以Ubuntu系统为例)
GMT软件的各个系统安装包都可以在其官方网站上下载,但是如果使用的是Ubuntu系统,新立得软件包里自带了GMT。因此,在Ubuntu系统中安装GMT的步骤如下:
1.      在Ubuntu软件中心,下载并安装新立得软件包(synaptic package manager);
2.      sudo apt-get install GMT         安装GMT软件
至此,GMT软件已经安装成功了。但是,如果此时使用GMT的话,所有命令之前都需要加上“GMT”,例如pscoast命令,要改成GMT pscoast,非常的不方便。我们可以通过更改$PATH环境变量来解决。添加环境变量步骤如下:在主目录下~下找到.bashrc文件,vim .bashrc; 添加环境变量,export PATH=”$PATH:/usr/lib/gmt/bin”;用source .bashrc命令运行.bashrc文件。此时,新打开的terminal在使用GMT命令时就无需再加”GMT”了。
注:GMT官方网站上提供的30个例子都可以从新立得软件里找到。
打开新立得软件,搜索GMT-examples,标记——重加载——安装即可。安装完成后,可以在/usr/share/doc/gmt-examples/examples找到所有的例子。

第一个GMT例子
打开terminal终端,让我们开始GMT之旅。
首先,新建一个文本文件,另文件名为plot.job。
vim plot.job
然后,在plot.job文件里输入以下代码。这些代码的含义将会在以下内容里详细讲解。
#! /bin/bash
# Purpose: create on the same page 4 maps of North America
ps=example_1.ps
gmtdefaults -D > ./.gmtdefaults4
gmtset ANNOT_FONT_SIZE_PRIMARY 8p \
HEADER_FONT_SIZE 16p            \
 LABEL_FONT_SIZE 10p                \
 LABEL_OFFSET 0.15c
R="-R-140/-50/20/65"

# Plot the 1st map
pscoast ${R} -JM2.75i -Ba20f5/a20f5WSNE -Ggrey -Swhite -Wblack -Dc -K -P > $ps
# Plot the 2nd map
pscoast -R -J -B20f5/20f5WSNE -Glightbrown -Slightblue -Lf-63.5/30/40/1500k+lkm \
    -Di -X3.5i -O -K >> $ps
# Plot the 3rd map
pscoast -R -J -O -K -B -Glightbrown -Slightblue -I1,2/blue -Wdarkblue -N2,- \
    -N1/red -Di -X-3.5i -Y2.75i >> $ps
# Plot the 4th map
pscoast -R -JL-95/42.5/33/45/2.75i -O -B20f5/20f5:."Lambert projection":ESwn -Wdarkblue -Glightbrown -Slightblue -X3.5i -Di -N2,- -N1/red -I1,2/blue >> $ps
第三步:增加文件的“执行”权限,并运行该文件。
chmod +x plot.job           !增加“执行权限”
bash plot.job                    !执行该文件
最后:查看结果(.ps文件即为输出结果)。
通常查看结果又很多方法,这里我们主要介绍三种。
最简单的方法,通常的pdf阅读器就可以查看该文件。
第二种方法:gs example_1.ps
第三种方法:gv example_1.ps。gv是一个专门查看.ps文件的一个程序,因此在使用该命令时,需要先安装。sudo apt-get install gv。安装完成后,即可通过gv命令查看文件了。

2012年2月2日星期四

双系统,win7和ubuntu,如何删除ubuntu

1. 下载MbrFix,解压放置C盘根目录下;

2. 打开cmd,进入dos命令窗口,输入cd c: 进入C盘根目录

3. 将MbrFix的属性中的兼容性改为以管理员身份运行

4. 输入 MbrFix /drive 0 fixmbr

5. 这时会弹出一个新的窗口,输入yes

6. 重启系统,进入windows磁盘管理,删除ubuntu分区即可



切记不可直接删除ubuntu分区,否则会导致grub无法引导系统。按照上述步骤,即可安全正确的删除ubuntu。