Linux Shell 极简教程:一个例子

Posted 一口Linux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux Shell 极简教程:一个例子相关的知识,希望对你有一定的参考价值。

原文: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" ] ; 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 极简教程:一个例子的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本极简教程

编程实践Linux / UNIX Shell编程极简教程

Python学习之Linux极简教程

Python学习之Linux极简教程

Python学习之Linux极简教程

linux shell编程bash编程shell教程bash教程shell文档bash文档shell脚本bash脚本教程第一部分:绪论