为了方便管理项目,自己写了一个`main.sh`脚本。根据需要简单修改即可很好的使用!
```bash
#!/usr/bin/env bash
cd $(dirname $0)
main(){
#LsFileType sh fish
DirMenuMain
#AutoMenu
}
#------------------------------
#自动菜单,包含所有文件夹和文件,
#按优先级决定执行
#------------------------------
function AutoMenu(){
echo " "
echo "++++++++++++++++++ $(basename $PWD) ++++++++++++++++++"
local m=$(ls)
#未检测到目标自动执行当前路径下的run脚本
if [ ${#m} -eq 0 ] || [ -f run ] || [ -f run.sh ] || [ -f run.fish ];then
ExecRun
exit 0
fi
echo "0.退出"
DisplayList $m
echo "" && read -p "输入对应菜单的序号:" key
if [ $(IsNumber $key) -eq 0 ] ; then
test $key -eq 0 && exit 0
local src=$(echo $m |xargs -n1|sed -n ''$key'p') #获取指定编号的内容
if [ -d $src ] ;then
cd $src
AutoMenu
elif [ -f $src ] ;then
echo ">自动执行$src文件"
ReadFileTypeAndAutoRun $src
exit 0
fi
else
echo "输入的不是数字!"
fi
}
#------------------------------
#以文件夹名称作为菜单名,文件夹下存在
#run/run.sh文件就执行该文件,否则列
#出该目录下的文件夹名称作为菜单名
#------------------------------
function DirMenuMain(){
echo " "
echo "++++++++++++++++++ $(basename $PWD) ++++++++++++++++++"
local m=$(LsDir)
#当前路径下没有下一级目录或者当前目录下存在 run/run.sh/run.fish脚本则自动执行脚本
if [ ${#m} -eq 0 ] || [ -f run ] || [ -f run.sh ] || [ -f run.fish ];then
ExecRun
exit 0
fi
echo "0.退出"
DisplayList $m
echo "" && read -p "输入对应菜单的序号:" key
if [ $(IsNumber $key) -eq 0 ] ; then
test $key -eq 0 && exit 0
local src=$(echo $m |xargs -n1|sed -n ''$key'p') #获取指定编号的内容
cd $src
DirMenuMain
else
echo "输入的不是数字!"
fi
}
#------------------------------
#为输入的对象添加索引并显示,索引从1
#开始
#@param:输入的资源
#------------------------------
function DisplayList(){
local idx=1
for i in $*
do
echo "$idx.${i%.*}"
idx=$[idx+1]
done
}
#------------------------------
#列出当前目录下的所有目录
#------------------------------
function LsDir()
{
for i in $(ls)
do
test -d $i && echo $i
done
}
#------------------------------
#自动执行当前路径下的特定脚本
#按优先级:
#1. run
#2. run.sh
#3. run.fish
#------------------------------
function ExecRun(){
echo "当前路径为:$PWD"
if [ -f run ] ;then
echo ">存在run文件,执行run脚本"
chmod +x run
./run $*
elif [ -f run.sh ]; then
echo ">存在run.sh文件,执行run.sh脚本"
chmod +x run.sh
./run.sh $*
elif [ -f run.fish ]; then
echo ">存在run.fish文件,执行run.fish脚本"
chmod +x run.sh
./run.sh $*
else
echo "不存在run或者run.sh脚本"
fi
}
#------------------------------
#列出当前目录下的所有目录,最前面
#添加序号
#------------------------------
function LsDirAddIndex()
{
local idx=1
local arr=''
for i in $(ls)
do
test -d $i && echo "$idx:$i" && idx=$[idx+1]
done
}
#------------------------------
#判断字符串是否为数字
#@return 0:是 1:不是
#------------------------------
function IsNumber(){
local y=$(echo "$1" | sed 's/[0-9]//g')
if [ -z "$y" ];then
echo 0 #是数字
else
echo 1 #"不是数字"
fi
}
#------------------------------
#文件类型筛选
#列出当前目录下所有满足指定后缀的
#文件
#@param:文件后缀
#例如:LsFileType sh fish plt
#------------------------------
function LsFileType(){
local src=""
for i in $*
do
find . -maxdepth 1 -type f -name "*.$i"
done
}
#-----------------------------------------
#函数名:ReadIni
#功能:读取ini文件
#@param1:ini文件路径
#@param2:Section
#@param3:Option
#例如:ReadIni test.ini s2 Path
#-----------------------------------------
function ReadIni(){
fid=$1
section=$2
option=$3
test ! -f $fid && echo "不存在文件$fid" && exit 2
if [ $# -eq 3 ] ; then
cat $fid | awk '/\['$section'\]/{f=1;next} /\[*\]/{f=0} f' | #找出section下的所有内容
grep $option | # 匹配option的行
grep '=' | # 看看是不是存在=
cut -d'=' -f2| # 获取对应的值
cut -d'#' -f1| # 去除注释
cut -d';' -f1| #去除注释
awk '{gsub(/^\s+|\s+$/, "");print}' #去掉最前面的空格
fi
}
#------------------------------
#自动根据文件后缀选择执行方式
#@param1:指定的文件
#------------------------------
function ReadFileTypeAndAutoRun(){
test ! -f $1 && echo "不存在$1文件" && exit 2
local srcpath=$(readlink -f $1)
cd $(dirname $srcpath)
local dst=$(date +%Y%m%d%H%M%S.mgo) #临时文件
chmod +x $(basename $srcpath)
case $1 in
*.sh | *.fish | *.pl | *.tcl | *.tk | *.py | *.lua) chmod +x $1 && ./$1 ;;
*.c) gcc -o $dst $1 && chmod +x $dst && ./$dst;;
*.cpp) g++ -std=c++11 -o $dst $1 && chmod +x $dst && ./$dst;;
*.go ) go build -o $dst $1 && chmod +x $dst && ./$dst ;;
*.plt) gnuplot $1 ;; #gnuplot
* ) echo "Fuck! I don't konw what it is!" ;;
esac
test -f $dst && rm $dst &>/dev/null
}
main $*
```