Chinaunix首页 | 论坛 | 博客
  • 博客访问: 346374
  • 博文数量: 49
  • 博客积分: 817
  • 博客等级: 军士长
  • 技术积分: 496
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-16 19:05
文章分类

全部博文(49)

文章存档

2014年(6)

2013年(7)

2012年(8)

2011年(28)

分类: LINUX

2011-09-16 12:23:03

1. eval
直白的说,eval的功能就是同时解析出现在它后面的所有变量。
  (1) 变量名需要使用到 $ 符号时
var1=alpha; eval $var1=abc
    变量名中是不允许使用$符号的,使用eval可以解决这个问题;eval负责先把 $var1 解析成 alpha ,然后 abc 赋给变量 alpha ;
var1=alpha; var2=abc; eval $var1=$var2
    eval先把 $var1 解析成 alpha, 然后把 $var2 解析成 abc,所以 $var1=$var2 变成了 alpha=abc,即把 abc 赋值给变量 alpha;
注意,eval解析变量时,是按照从左到右的顺序解析的,即先解析 $var1,然后解析 $var2,如果 var1 为空或者没有这个变量,这个赋值表达式会报错。
  (2) 赋的值包含多个变量时
     
  1. read -p "please input file name you want to create :" fileuser

  2. filename=${fileuser:-noname}               #如果$fileuser这个变量不存在或值为空,则输出noname
  3.                                            #如果值存在,则保留原来的值
  4. date1=$(date +%Y%m%d --date "2 days ago")  #我这里的结果为 20110914
  5. date2=$(date +%Y%m%d --date "1 days ago")  #我这里的结果为 20110915
  6. date3=$(date +%Y%m%d)                      #我这里的结果为 20110916

  7. for i in `seq 1 3`;do
  8.         eval tmp=$filename\$date$i
  9.         echo $tmp
  10.         if [ -e "$tmp" ];then
  11.                 echo "$tmp exist"
  12.         else
  13.                 touch "$tmp"
  14.         fi
  15. done
     eval tmp=$filename\$date$i
    这里的值由3个变量组成,eval会把它们全部解析成具体的值然后赋给 tmp 。这个表达式会解析两遍(假设输入的filename是em)
1) tmp=em$date1                ##$filename=em,  $i=1
2) tmp=em20110914              ##$date=20110914
重点注意 \$date,第一次解析了$filename,$i,把转义符 \ 解析掉,保留了后边的 $,变成了em$date1 ;第二次解析 $date1。\$date  相当于 '$date'可以用来控制eval解析的顺序。如果表达式 没有加转义符 \ 或者单引号,则 tmp=$filename$date$i,会按从左至右的顺序解析,解析到$date时,因为没有这个变量,所以值为空,则 tmp=em1,这样并不是我们想要的结果。

2. rename
  rename和mv都有更改文件名称的功能,相比之下,rename功能更强大,可以批量更改文件名,而mv只能更改单一文件名
  1) mv oldname newname 把文件oldname重命名成newname
  2) rename old new pattern
rename有三个参数——旧文件名,新文件名,匹配模式
旧文件名可以是文件名的全称,也可以是文件名称中的一部分;
新文件名是旧文件名要改成的样子,如果旧文件名只是文件名的一部分的话,只修改对应的部分;
比较重要的是 匹配模式 参数,这个参数必须有,不指定它,rename是不会工作的。它支持 ? (匹配单一字符)和 * (匹配任意字符);
e.g. 有如下文件 ok111  ok123  ok124  ok222  ok333
rename ok file ok12?
其中 ok 是旧文件名,但是ok只是旧文件名称中的一部分;新文件名是file;匹配模式是ok12?,就是说只对以 ok12 开头再加一个字符的文件进行更改,即ok123, ok124 这两个文件。
整个命令的作用是,首先找到 匹配 ok12? 的文件,然后把这些文件名中含有 ok 的部分改成 file,效果是这样: ok123-->file123,  ok124-->file124;

rename ok good ok222
指定 ok222 这个文件,只把它的文件名中含有的 ok 这两个字符更改为 good,这是针对一个文件更改的情况;效果如下:ok222-->good222

rename ok fine *
这条命令意思是,匹配所有文件,只要文件名中含有 ok 这两个字符,一律把 ok 更改为 fine;
============================================
在Unbuntu中,rename支持正则表达式,功能更加强大。
rename 's/\.conf/\.sh/' ./* 把当前目录下的所有文件名中的.conf改成.sh
rename 's/$/\.sh' ./* 在当前目录下的所有文件名后添加.sh后缀
rename 's/.\sh$//' ./* 删除当前目录下所有文件名中的.sh后缀

用rename批量更改文件名,可以少写很多shell语句,很实用。
阅读(2352) | 评论(0) | 转发(0) |
0

上一篇:实用linux命令

下一篇:linux 杂记

给主人留下些什么吧!~~