#函數是功能是以自定義的方式把命令行的選項和參數拆分成數組。引號中的內容在計算位置時會當作一個整體。 #parse.option <default> <retain> "$@" #default 默認選項,如果為空請用 - 占位 #retain 保留最后幾位做為參數 #"$@" 這個變量表示參數列表 # 如:parse.option '-de -f' 2 "$@"
function parse.option(){ local defalut="$1" local option="" local retain="$2" local args="" shift 2; local arr=( "$@" ) local length=${#arr[@]} for i in "${!arr[@]}"; do [ -n "`echo ${arr[$i]} | grep -P '\s*\w+\s+\s*'`" ] && arr[$i]="\"${arr[$i]}\"" done [ $length -eq "$retain" ] && args=${arr[@]:$length - $retain} [ $length -gt "$retain" ] && { option=${arr[@]:0:$length - $retain}; args=${arr[@]:$length - $retain}; } [ -z "$option" -a "$defalut" != '-' ] && option="$defalut" echo "([0]='$option' [1]='$args')" }
我想擴展一個 ln 命令,因為它不夠方便,非要寫絕對路徑。我想讓相對路徑也創建。
function ln(){
declare -A all=`parse '-isv' 2 "$@"` set -- ${all[1]} local target=$1 [ ${target:0:1} != '/' ] && target="`pwd`/$target" sudo /usr/bin/ln ${all[0]} $target $2
}
這里用到了 parse.option "$*" 2 '-is' 也就是說,前面都是選項,只有最后兩位是參數,默認選項是 -is 選項我不管,我只處理路徑參數
如果目標路徑不是以 / 開頭,那就在路徑前面加上當前路徑,組成絕對路徑。這樣既擴展了 ln 的功能,同時也沒有把選項寫死。
下面還有一些常用函數。
function start(){ case "$1" in 'php') sudo php-fpm;; 'nginx') sudo nginx;; 'redis') redis-server;; :*) local item="${@#:}" [ "$@" == ":all" ] && item="$(docker ps -q -f status=exited)" [ -n "$item" ] && docker start $item ;; '') start docker;; 'web') start php && start nginx;; *) sudo service $1 start;; esac } function stop(){ case "$1" in 'php') sudo pkill -9 php-fpm;; 'nginx') sudo nginx -s stop;; 'web') stop php && stop nginx;; 'redis') redis-cli shutdown;; -*) sudo pkill -9 ${1#-};; :*) local item="${@#:}" [ "$@" == ":all" ] && item="$(docker ps -q)" [ -n "$item" ] && docker stop $item ;; *) sudo service $1 stop;; esac } #批量將文件鏈接到 bin 目錄,如果參數是一個目錄,則鏈接目錄中的所有文件 function tobin(){ [ $# == 1 -a -d "$1" ] && { cd $1; set -- `ls $1`; } for item in "$@"; do [ ${item:0:1} != '/' ] && item="`pwd`/$item" [ -f "$item" ] && sudo ln -fs $item /usr/local/bin && echo "$item" done } function tosbin(){ [ $# == 1 -a -d "$1" ] && { cd $1; set -- `ls $1`; } for item in "$@"; do [ ${item:0:1} != '/' ] && item="`pwd`/$item" [ -f "$item" ] && sudo ln -fs $item /usr/local/sbin && echo "$item" done } #打開文件或目錄 #可以打開 docker 容器中的文件,如: open :container /tmp/test.txt 注:參數要冒號開頭 #會把容器中的文件復制到 /tmp/<container>/ 目錄中,如果復制為成功,則在該目錄新建。 #可以再結合一個 push :container /tmp/test.txt 就會找到 /tmp/<container>/test.txt 並復制到容器中 #如果沒有參數,表示打開當前目錄 #由於我是用的 WSL 打開當前目錄的命令 explorer.exe . 請換成 xdg-open 命令 function open(){ option="$1" case "$option" in '-source') code /etc/apt/sources.list;; '-profile') code /etc/profile;; '-bashrc') code /etc/bash.bashrc;; :*) local con="${option#:}" local file="/tmp/$con`basename $2`" mkfdir $file docker cp $con:$2 $file 2>/dev/null open $file ;; '') explorer.exe .;; #xdg-open $PWD;; *) mime=`file --mime-type $option | awk '{print $2}'` #如果是符號鏈接 if [ $mime == 'inode/symlink' ];then option=`readlink -e $option` mime=`file --mime-type $option | awk '{print $2}'` fi if [ -n "`echo $mime | grep -E '^(text/|inode/x-empty|application/json)'`" ];then #用編輯器打開 code $option elif [ "$mime" = 'inode/directory' ];then cd $option && explorer.exe . #xdg-open $option elif [ "$mime" != 'cannot' ];then #默認方式打開 color red "文件類型:$mime" explorer.exe $option #xdg-open $option else color red "新建: $option" [ ! -w . ] && sudo touch $option code $option fi ;; esac } #可以推送 git #可以結合上面 open 可以再把文件推送到容器 function push(){ option="$1" case "$option" in :*) local conter="${option#:}"; docker cp /tmp/$conter/`basename $2` $conter:$2 || { echo "上傳失敗"; return 1; };; '') push .;; *) git add $@ && git commit -m '日常更新' && git push;; esac } #文件重命令 #第二個參數只是單純表示新名字,如:rename /home/old.txt new.txt function rename(){ sudo mv $1 `dirname $1`/$2 } #類似於 whereis 命令,但列出內容更詳細 function where(){ local name="$1" [ -n "`which $name`" ] && { color red "當前命令:"; which $name; } [ -n "`type -a $name 2>/dev/null`" ] && { color red "命令列表:"; type -a $name; } [ "`whereis $name`" != "$name:" ] && { color red "目錄列表:"; whereis $name; } || color red "$name 不存在" } #綜合了 apt install 和 dpkg -i 安裝軟件 #如果不帶任何參數,則進入查找安裝過程 #如:install 回車,輸入 mysql,會列出包名,輸入要安裝的包名或輸入 exit 退出 function install(){ if [ $# == 0 ];then [ -z `which sudo` ] && apt install -y sudo local software="" until [ "$software" == 'exit' ] do echo -en "\033[31m查找: \033[0m" read software [ "$software" == 'exit' -o -z "$software" ] && break apt list "$software*"; apt list "lib{$software}*"; echo -en "\033[31m安裝: \033[0m" read software if [ "$software" == 'next' -o -z "$software" ];then continue elif [ "$software" == 'exit' ];then break fi sudo apt install -y $software && echo $software >> ~/.install.log done else local ext="${1##*.}" case "$ext" in 'deb') sudo dpkg -i $1;; 'rpm') sudo rpm -i $1;; *) if [ -n "`which apt`" ];then sudo apt install -y $1 && echo $1 >> ~/install.log elif [ -n "`which yum`" ];then sudo yum install -y $1 && echo $1 >> ~/install.log fi ;; esac fi }