说明:这是一个比较简单的bash脚本编辑器,但是已经经过测试。书写此博客的原因,一方面是练习循环控制语言、函数、位置参数、本地变量以及函数参数调用,以及函数之间调用等等,还有就是获得用户选项以及选项的参数。
注:脚本选项以及脚本选项参数获得方法使用getopt并进行进一步判断,请查阅main()函数.
#!/bin/bash # Author: 李安杰 # Time: 2014-12-05 show_usage(){ echo 'Usage mkscript.sh [-D|--description "script description"] [-A|--author "script author"] /path/to/somefile' } write_file_header(){ #写文件头部信息 local file_path="$1" local desc=$2 local auth=$3 cat >> $file_path <<EOD #!/bin/bash # Description: $desc # Author: $auth # EOD } create_file(){ # 创建新文件 local file_path="$1" judge_dir $file_path [ $? -eq 0 ] && write_file_header "$file_path" "$desc" "$auth" vim + $file_path chk_syntax "$file_path" } judge_dir(){ #判断目录是否存在切有写权限 local file_path="$1" local dirname=$(dirname $file_path) if [ -d "$dirname" ];then [ -w "$dirname" ] && return 0 else #echo "No such Directory or $dirname permission denied." exit 1 fi } chk_syntax(){ # 判断文件是否有脚本语法错误 local file_path="$1" clear if /bin/bash -n "$file_path" ;then chmod +x "$file_path" exit 0 else while true;do read -p " File has a syntax error, whether to continue editing. (y/n):" opts case $opts in y|Y) vim + "$file_path" chk_syntax "$file_path" ;; n|N) exit 0 ;; esac done fi } modify_file(){ # 文件修改相关操作 local file_path="$1" local desc=$2 local auth=$3 judge_dir "$file_path" if [ $? -eq 0 ] ;then header=$(head -1 "$file_path") if [ "$header" != "#!/bin/bash" ]; then echo "This is not a script file,grogram will be exit." && exit 1 elif [ "$header" == '#!/bin/bash' ];then if [ ! -z "auth" ] && [ ! -z "$desc" ];then if grep "# Author:" "$file_path" && grep "# Description:" "$file_path";then sed -i "1,5 s/\(# Author:\).*/\1 $auth/" "$file_path" sed -i "1,5 s/\(# Description:\).*/\1 $desc/" "$file_path" else sed -i "1a \# Author: $auth" "$file_path" sed -i "2a \# Description: $desc" "$file_path" fi vim + "$file_path" chk_syntax "$file_path" elif [ ! -z "$auth" ];then if grep '# Author:' "$file_path" ;then sed -i "1,5 s/\(# Author:\).*/\1 $auth/" "$file_path" else sed -i "1a \# Author: $auth" "$file_path" fi vim + "$file_path" chk_syntax "$file_path" elif [ ! -z "$desc" ];then if grep '# Description:' "$file_path" ;then sed -i "1,5 s/\(# Description:\).*/\1 $desc/" "$file_path" else sed -i "2a \# Description: $desc/" "$file_path" fi vim + "$file_path" chk_syntax "$file_path" else vim + "$file_path" chk_syntax "$file_path" fi fi fi } main(){ TEMP=`getopt -o A:D: --long author:,description: -- "$@"` [ $? -ne 0 ] && echo -e "\033[31mERROR: unknown argument! \033[0m\n" && show_usage && exit 1 eval set -- "$TEMP" #echo "$TEMP" while true;do [ -z "$1" ] && show_usage && exit 1 case "$1" in -D|--description) #该选项的参数就是$2 desc=$2 [ ${desc:0:1} == "-" ] && [ -z ${desc:2:1} ] && show_usage && exit 1 shift 2;; -A|--author) #该选项的参数就是$2 auth=$2 [ ${auth:0:1} == "-" ] && [ -z ${auth:2:1} ] && show_usage && exit 1 shift 2;; --) shift [ $# -ne 1 ] && show_usage && exit 1 file_path="$1" break;; *) #使用其他参数给提示错误,并退出. show_usage && exit 1 esac done #echo "desc:$desc" #echo "auth:$auth " #echo "file_path: $file_path" if [ ! -f "$file_path" ];then create_file "$file_path" && chk_syntax "$file_path" elif [ -f "$file_path" ];then modify_file "$file_path" "$desc" "$auth" fi } main "$@"
希望这篇博客能帮助到您,如果有更好的方法或改进的地方请,留言。谢谢您的耐心查阅。