记得之前写过一篇文章是关于shell 脚本的,这里,当时的系统是 CentOS 的,最近公司把所有的服务器系统都更换为 Ubuntu 了,
结果以前写的那个脚本无法执行了,错误就是 Bad substitution,网上搜索基本都是 {} 和 () 误用导致的,但我这个脚本没有用错,最后是发现 sh 不同版本的区别,CentOS 默认用的应该是 bash,而 Ubuntu 用的是 dash。
#!/bin/bashif [ $# != 1 ]; thenecho "Usage: $0 dir"exit
fidir=$1#取第一个参数的最后一个字符,由于tab自动补全会带有"/",而下面的函数里路径已经添加了"/"
lastChar=${1:0-1}
echo $lastCharif [ "/" == "${lastChar}" ]; thenlen=${#1} #第一个参数的长度dir=${1:0:len-1} #不要最后的"/"echo ${dir}
fifunction changeEncode()
{for fileName in `ls $1`doif [ -d $1/${fileName} ]; thenecho -e "\033[33mentry $1/${fileName}\033[0m"changeEncode $1/${fileName} #递归调用,继续把子目录作为参数来调用函数elsefile $1/${fileName} | xargs | grep -n "UTF-8"if [ $? -eq 0 ]; theniconv -f UTF-8 -t GB2312 $1/${fileName} -o $1/${fileName}fifidone
}changeEncode ${dir}
最后看了一下,sh 是指向 dash 的符号链接:
此时搜索 dash 和 bash 的区别会发现,Debian 和 Ubuntu 用的就是 dash,这两个的语法还是有很大区别的,这里不讨论了,脚本不修改的情况下,直接用 /bin/bash 来执行了。