linux bash 编辑器,Linux bash综合实例之 bash脚本编辑器

说明:这是一个比较简单的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 <

#!/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 "$@"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值