原文:https://www.toutiao.com/i6964632560504816164/

Linux Shell 极简教程:一个例子-编程知识网

 

获取命令行入参

#!/bin/sh
echo "Usage: run-dev.sh \$moduleName \$port"
echo 'e.g: run-dev.sh huskar-web 7001'moduleName=$1
port=$2

while 循环

while [ -h "\$PRG" ] ; dols=`ls -ld "\$PRG"`link=`expr "\$ls" : '.*-> \\(.*\\)\$'`done

 

if 分支控制

if expr "\$link" : '/.*' > /dev/null; thenPRG="\$link"
elsePRG=`dirname "\$PRG"`"/\$link"
fi

 

kill 进程

kill java server.port=PORT进程

ps -ef | grep java | grep "server.port=$port" | awk '{print $2}' | xargs kill -9

 

定义函数

run() {...
}

 

执行函数

run

替换文件中的字符串

find -P $bootstrapShellPath | xargs perl -pi -e 's|\$profile|dev|g'

执行一个脚本

exec bootstrap.sh

 

完整脚本:

#!/bin/sh
echo "Usage: run-dev.sh \$moduleName \$port"
echo 'e.g: run-dev.sh huskar-web 7001'
moduleName=$1
port=$2
#1.kill java server.port=PORT进程
ps -ef | grep java | grep "server.port=$port" | awk '{print $2}' | xargs kill -9
echo "Start Run $moduleName ..."
#Set env profile,PORT
run() {echo "Set env profile,PORT of ./output/$moduleName/bootstrap.sh"bootstrapShellPath="./output/$moduleName/bootstrap.sh"#set --spring.profiles.active=$profile --server.port=$PORTecho $bootstrapShellPathfind -P $bootstrapShellPath | xargs perl -pi -e 's|\$profile|dev|g'find -P $bootstrapShellPath | xargs perl -pi -e 's|\$PORT|'${port}'|g'cat $bootstrapShellPath#4.execute bootstrap.shbootstrapShellDir="./output/$moduleName"#cd bootstrap.sh dircd $bootstrapShellDirexec bootstrap.sh
}
# main function
run

 

#!/usr/bin/env sh##############################################################################
##
##  start up script for UN*X
##
##############################################################################
# set -o nounset
# set -e -x# Attempt to set APP_HOME
# Resolve links: \$0 may be a link
PRG="\$0"
# Need this for relative symlinks.
while [ -h "\$PRG" ] ; dols=`ls -ld "\$PRG"`link=`expr "\$ls" : '.*-> \\(.*\\)\$'`if expr "\$link" : '/.*' > /dev/null; thenPRG="\$link"elsePRG=`dirname "\$PRG"`"/\$link"fi
done
cd "`dirname \"\$PRG\"`/${appHomeRelativePath}" >/dev/null
APP_HOME="`pwd -P`"APP_BASE_NAME=`basename "\$0"`# deal with jJVM_OPTS and START_OPS
if [ ! -d "logs" ] ; thenmkdir logs
fi
if [ ! -d "tmp" ] ; thenmkdir tmp
fiDT=`date +"%Y%m%d_%H%M%S"`# STANDARD_JVM_OPTS="-Xloggc:\$APP_HOME/logs/gc_\$DT.log"
# STANDARD_JVM_OPTS="\$STANDARD_JVM_OPTS -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCApplicationConcurrentTime"
# STANDARD_JVM_OPTS="\$STANDARD_JVM_OPTS -XX:+PrintHeapAtGC -XX:+PrintAdaptiveSizePolicy"
# STANDARD_JVM_OPTS="\$STANDARD_JVM_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=\$APP_HOME/tmp/heapdump_\$DT.hprof"
# STANDARD_JVM_OPTS="\$STANDARD_JVM_OPTS -XX:-OmitStackTraceInFastThrow"
# STANDARD_JVM_OPTS="\$STANDARD_JVM_OPTS -XX:SoftRefLRUPolicyMSPerMB=0"
# STANDARD_JVM_OPTS="\$STANDARD_JVM_OPTS -XX:-ReduceInitialCardMarks"STANDARD_START_OPTS="-Djava.io.tmpdir=\$APP_HOME/tmp/"
STANDARD_START_OPTS="\$STANDARD_START_OPTS -Duser.dir=\$APP_HOME"
STANDARD_START_OPTS="\$STANDARD_START_OPTS -Djava.net.preferIPv4Stack=true"warn () {echo "\$*"
}die () {echoecho "\$*"echoexit 1
}CLASSPATH=huskar-web-1.0.0.jarjava  -server -Xms4096m -Xmx4096m -Xmn614m -XX:SurvivorRatio=15 -XX:+UseParNewGC -XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=15 -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:+ScavengeBeforeFullGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=9 -XX:CMSInitiatingOccupancyFraction=60 -XX:+CMSClassUnloadingEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:-ReduceInitialCardMarks -XX:CMSInitiatingPermOccupancyFraction=70 -XX:-OmitStackTraceInFastThrow -XX:+PrintGCDetails -Xloggc:/opt/log/gc.log -XX:+PrintGCTimeStamps -jar huskar-web-1.0.0.jar ${main_class} --spring.profiles.active=dev --server.port=7001

 

Shell脚本解释器

Shell脚本通常不是复杂的程序,并且它是按行解释的。脚本第一行通常会以类似于 #!/bin/bash 开始,这段脚本用于通知 Shell 使用系统上的 Bourne Shell 解释器。为什么说“类似于”呢?因为,实际上我们不仅可以使用 bash 解释器,还可以使用其他一些解释器,甚至是以命令开头,后面紧跟其参数。例如:

#!/usr/bin/awk
#!/bin/sed

 

Shell命令的通配符

  星号“ * ”可以匹配文件名中的任何字符串。例如我们给出文件名模式 file*,它的意思是文件名以 file 开头,后面可以跟随任何字符串,包括空字符串。

$ ls file*
file    file1   file2   file3   file_test

 

  注意:在通配符里,一个星号“ * ”可以代表0个或多个任意字符。

  问号“ ? ”可以匹配任何单个字符。例如我们给出文件名模式 file?,它的意思是文件名以 file 开头,以任意1个字符结尾的文件:

$ ls file?
file1   file2   file3

 

  注意:一个问号“ ? ”要匹配1个任意字符。

  方括号“ [ ] ”可以匹配任意单个指定的字符。下面的例子将列出文件名以 file 开头,以任意1个数字结尾的文件:

$ ls file[0-9]
file1  file2  file3

 

  方括号“ [! ] ”可以匹配任意除指定的字符之外的单个字符。下面的例子中将列出文件名以 file 开头,不以数字结尾的文件:

$ ls file*[!0-9]
file_test