测试(可以看到program始终是没变的):
(1)、用截断的操作方式批量修改文件名(删除一部分): ①先产生批量文件: 生成20个有着相似的文件名的文件以便于操作:
#!/bin/sh #script-name:create.sh for file in `seq -s " " 20` do touch "kangruojin_code_day${file}.c" done②批量修改文件名(删除一部分):
#!/bin/sh #script-name:delpartname.sh sh create.sh#先调用create.sh脚本产生操作的文件 for file in `ls *.c` do #通过mv命令将原来的文件名改为:通过${file#kangruojin_}删除kangruojin_前半部分的文件名。 /bin/mv $file ${file#kangruojin_} done(2)、用替换的操作方式批量修改后缀名:
#!/bin/sh #change filename suffix from ".c" to ".cpp" for file in `ls *.c` do #从尾部开始替换,用cpp替换c,然后修改名字 /bin/mv $file ${file/%c/cpp} done对于以上两种批量操作的测试如下:
脚本的强大之处立即显现了出来。
测试如下:
由于上面的操作是判断变量存在与否、是否已经初始化。所以多用在安全操作的判断中。 如下案例:如果path路径不存在,为了防止不可预见的错误删除,虽然加了一层逻辑或的关系,但是我们将path不存在时的path初始化为“/tmp/”即会更加安全,并且不会删除不可预知的东西了:
最开始我们说,${#string} 与$string | wc -m 都可以测量长度,但是wc -m(多一个字符是结束标志)。除了以上两种方式我们还可以用echo $(expr length "$string") 的方式测字符串长度:
但是哪一种方式效率高呢?我们用下面这个例子来测试:
/*循环测量10000次并用time测试程序执行时间*/ time for i in `seq 10000`;do cout=${#str};done time for i in `seq 10000`;do cout=`echo {str} | wc -m`;done time for i in `seq 10000`;do cout=$(expr length "$str");done即如果如下: 可以发现${#string} 的效率最高,因为${#string} 是内置的,而wc命令是经过C语言写出的程序,经过一层包装所以效率最慢。而expr命令也是经过包装的,效率也差了十多倍(其差别在:wc与expr是浪费在了用户与内核的交互上,真正用来计算的时间差不了几倍),所以在脚本中能使用内置操作的尽量使用,而不要优先去使用现有的命令。
