程序员的知识教程库

网站首页 > 教程分享 正文

Linux Shell 极简教程:一个例子(linux优秀shell实例)

henian88 2024-08-15 04:53:55 教程分享 15 ℃ 0 评论



获取命令行入参

#!/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" : '.*-> \\(.*\\)\#39;`
    
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" : '.*-> \\(.*\\)\#39;`
    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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表