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) 赋的值包含多个变量时
- read -p "please input file name you want to create :" fileuser
- filename=${fileuser:-noname} #如果$fileuser这个变量不存在或值为空,则输出noname
- #如果值存在,则保留原来的值
- date1=$(date +%Y%m%d --date "2 days ago") #我这里的结果为 20110914
- date2=$(date +%Y%m%d --date "1 days ago") #我这里的结果为 20110915
- date3=$(date +%Y%m%d) #我这里的结果为 20110916
- for i in `seq 1 3`;do
- eval tmp=$filename\$date$i
- echo $tmp
- if [ -e "$tmp" ];then
- echo "$tmp exist"
- else
- touch "$tmp"
- fi
- 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语句,很实用。
阅读(2463) | 评论(0) | 转发(0) |