说明:这是一个比较简单的bash脚本编辑器,但是已经经过测试。书写此博客的原因,一方面是练习循环控制语言、函数、位置参数、本地变量以及函数参数调用,以及函数之间调用等等,还有就是获得用户选项以及选项的参数。
注:脚本选项以及脚本选项参数获得方法使用getopt并进行进一步判断,请查阅main()函数.
#!/bin/bash# Author: 李安杰# Time: 2014-12-05show_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=$2local auth=$3cat >> $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_pathchk_syntax "$file_path" }
judge_dir(){
#判断目录是否存在切有写权限local file_path="$1"local dirname=$(dirname $file_path)if [ -d "$dirname" ];
then [ -w "$dirname" ] && return 0else #echo "No such Directory or $dirname permission denied." exit 1 fi}
chk_syntax(){
# 判断文件是否有脚本语法错误local file_path="$1"clearif /bin/bash -n "$file_path" ;
then chmod +x "$file_path" exit 0else 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=$2local auth=$3judge_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 fifi}
main(){
TEMP=`getopt -o A:D: --long author:,description: -- "$@"`[ $? -ne 0 ] && echo -e "