Linux Shell 极简教程:一个例子
Posted 一口Linux
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux Shell 极简教程:一个例子相关的知识,希望对你有一定的参考价值。
原文:https://www.toutiao.com/i6964632560504816164/
获取命令行入参
#!/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" ] ; do
ls=`ls -ld "\\$PRG"`
link=`expr "\\$ls" : '.*-> \\\\(.*\\\\)\\$'`
done
if 分支控制
if expr "\\$link" : '/.*' > /dev/null; then
PRG="\\$link"
else
PRG=`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=$PORT
echo $bootstrapShellPath
find -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.sh
bootstrapShellDir="./output/$moduleName"
#cd bootstrap.sh dir
cd $bootstrapShellDir
exec 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" ] ; do
ls=`ls -ld "\\$PRG"`
link=`expr "\\$ls" : '.*-> \\\\(.*\\\\)\\$'`
if expr "\\$link" : '/.*' > /dev/null; then
PRG="\\$link"
else
PRG=`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" ] ; then
mkdir logs
fi
if [ ! -d "tmp" ] ; then
mkdir tmp
fi
DT=`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 () {
echo
echo "\\$*"
echo
exit 1
}
CLASSPATH=huskar-web-1.0.0.jar
java -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
以上是关于Linux Shell 极简教程:一个例子的主要内容,如果未能解决你的问题,请参考以下文章
linux shell编程bash编程shell教程bash教程shell文档bash文档shell脚本bash脚本教程第一部分:绪论