Linux bash综合实例之 bash脚本编辑器
2014-12-06 13:27
232 查看
说明:这是一个比较简单的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 "$@"
注:脚本选项以及脚本选项参数获得方法使用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 "$@"
相关文章推荐
- Linux bash综合实例之 bash脚本编辑器
- bash脚本实例-linux性能数据清洗-1
- Linux 在Bash脚本中怎么关闭文件描述符的实例
- bash应用实例--交互式进程(如telnet)的自动处理脚本
- python 捕获 shell/bash 脚本的输出结果实例
- python 捕获 shell/bash 脚本的输出结果实例
- bash部分脚本实例及介绍
- bash脚本编程之条件判断、算术运算及实例
- 将Vim编辑器打造成Bash Shell脚本IDE
- bash脚本实例
- 如何用 bash-support 插件将 Vim 编辑器打造成编写 Bash 脚本的 IDE
- TCL/EXPECT自动化测试脚本实例二 --- 主程序
- Bash编程实例学习总结
- Bash 实例
- 一个bash备份脚本
- TCL/EXPECT自动化测试脚本实例四 --- 批命令执行
- Bash 实例,第 2 部分
- TCL/EXPECT自动化测试脚本实例一 --- telnet到目标机器
- BASH脚本编写教程[ZZ]
- 准备编写ogl2dlib的动画脚本编辑器