整理学习 shell 脚本编写过程中遇到的各种疑难杂症, 以及分享一个 jar 包启动脚本, 万能呦~~~
grep 的一个小技巧
grep *.jar 这个命令, 依赖当前文件夹下的 jar 的名称, 然后在去匹配
也就是说 当前文件夹下匹配的 jar 包名称, 会自动替换 *.jar
可以使用 echo *.jar 实验
多个匹配的结果会用空格隔开
shell 脚本编写过程中需要注意的事项
1
2
3
4
5
1. = 号是赋值符号, 前后不允许有空格, 不然会报错
2. 字符串是赋予变量的值, 必须使用单引号 ''  或者双引号 ""  包围, 否则会有语义错误
3. 变量的引用, 需要使用 ${param} 这类方式引用
4. if[] 是标准的判断表达式, [] 与 test 命令一样, 可以判断表达式是否为真,  if[[]] 支持正则等, 表达式左右必须要有空格!!!!!!!!!!
5. -a 叫选项 option  abc 叫参数 parameter
例子代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#!/bin/sh
echo "
 *************************************
 *          Author by gomyck         *
 * --------------------------------  *
 *|  qq:    474798383              | *
 *|  email: hao474798383@163.com   | *
 *|  blog:  https://blog.gomyck.com| *
 * --------------------------------  *
 *************************************
 "
JAVA_HOME=
RESOURCE_NAME=*.jar
LOG_PATH="/dev/null"
BACK_PATH=
XX_INFO=
ACTIVE=none
CK_RANDOM="gomyck.$RANDOM.$RANDOM"
GREP_RANDOM="gomyck.none"
OLD_RANDOM=`cat rdm`
if [ $? == 0 ]; then
    GREP_RANDOM=${OLD_RANDOM}
fi
PARAM_VALUE='-Dfile.encoding=UTF-8 -Deureka.instance.ip-address= -Djasypt.encryptor.password='
while [ -n "$1" ]
do
    case "$1" in
         -param | -p)
            PARAM_VALUE="$2"
            echo "系统属性配置: $2"
            shift ;;
         -xx | -x)
            XX_INFO="$2"
            echo "虚拟机非标准选项配置: $2"
            shift ;;
        -back | -b)
            BACK_PATH="$2"
            echo "文件备份位置: $2"
            shift ;;
        -log | -l)
			LOG_PATH="$2"
            echo "日志输出位置: $2"
            shift ;;
        -active | -a)
			ACTIVE="$2"
            echo "激活配置: $2"
            shift ;;
        --) shift
            break ;;
        *) ACTIVE="$1";;
    esac
    shift
done
if [[ ${ACTIVE} != "pro" && ${ACTIVE} != "dev" && ${ACTIVE} != "test" ]]; then
    echo "Please input a profile you want active -> [dev pro test]"
    exit
fi
if [[ ${ACTIVE} ==  "test" || ${ACTIVE} ==  "dev" ]]; then
	echo "开发测试环境, 日志默认输出位置: ./gomyck.log"
	LOG_PATH="gomyck.log"
fi
tpid=`ps -ef|grep $GREP_RANDOM|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo Elegant Close Application... ${tpid}
    kill -15 $tpid
fi
sleep 5
tpid=`ps -ef|grep $GREP_RANDOM|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo  Hard Close Application... ${tpid}
    kill -9 $tpid
else
    echo Close Success!
    echo Bootstrap Application...
fi
rm -f rdm
rm -f tpid
if [ ${BACK_PATH} ]; then
    if [ ! -d ${BACK_PATH}  ];then
      mkdir $BACK_PATH
    fi
    cp -f ./*.jar $BACK_PATH
fi
if [ ${JAVA_HOME} ]; then
    nohup $JAVA_HOME/bin/java -jar $PARAM_VALUE $XX_INFO -Dspring.profiles.active=${ACTIVE} -DckFlag=${CK_RANDOM} ./$RESOURCE_NAME > ${LOG_PATH} 2>&1 &
else
    nohup java -jar $PARAM_VALUE $XX_INFO -Dspring.profiles.active=${ACTIVE} -DckFlag=${CK_RANDOM} ./$RESOURCE_NAME > ${LOG_PATH} 2>&1 &
fi
echo ${CK_RANDOM} > rdm
echo $! > tpid
echo Application is Running!!!
if [[ ${ACTIVE} ==  "test" || ${ACTIVE} ==  "dev" ]]; then
	tail -f gomyck.log
fi
其他知识点
kill 命令接收的信号量
| SignalName | Number | Description | 
|---|---|---|
| SIGHUP | 1 | Hangup (POSIX) | 
| SIGINT | 2 | Terminal interrupt (ANSI) | 
| SIGQUIT | 3 | Terminal quit (POSIX) | 
| SIGILL | 4 | Illegal instruction (ANSI) | 
| SIGTRAP | 5 | Trace trap (POSIX) | 
| SIGIOT | 6 | IOT Trap (4.2 BSD) | 
| SIGBUS | 7 | BUS error (4.2 BSD) | 
| SIGFPE | 8 | Floating point exception (ANSI) | 
| SIGKILL | 9 | Kill(can’t be caught or ignored) (POSIX) | 
| SIGUSR1 | 10 | User defined signal 1 (POSIX) | 
| SIGSEGV | 11 | Invalid memory segment access (ANSI) | 
| SIGUSR2 | 12 | User defined signal 2 (POSIX) | 
| SIGPIPE | 13 | Write on a pipe with no reader, Broken pipe (POSIX) | 
| SIGALRM | 14 | Alarm clock (POSIX) | 
| SIGTERM | 15 | Termination (ANSI) | 
| SIGSTKFLT | 16 | Stack fault | 
| SIGCHLD | 17 | Child process has stopped or exited, changed (POSIX) | 
| SIGCONT | 18 | Continue executing, if stopped (POSIX) | 
| SIGSTOP | 19 | Stop executing(can’t be caught or ignored) (POSIX) | 
| SIGTSTP | 20 | Terminal stop signal (POSIX) | 
| SIGTTIN | 21 | Background process trying to read, from TTY (POSIX) | 
| SIGTTOU | 22 | Background process trying to write, to TTY (POSIX) | 
| SIGURG | 23 | Urgent condition on socket (4.2 BSD) | 
| SIGXCPU | 24 | CPU limit exceeded (4.2 BSD) | 
| SIGXFSZ | 25 | File size limit exceeded (4.2 BSD) | 
| SIGVTALRM | 26 | Virtual alarm clock (4.2 BSD) | 
| SIGPROF | 27 | Profiling alarm clock (4.2 BSD) | 
| SIGWINCH | 28 | Window size change (4.3 BSD, Sun) | 
| SIGIO | 29 | I/O now possible (4.2 BSD) | 
| SIGPWR | 30 | Power failure restart (System V) | 
常用的信号量有 2 9 15
cat » fileName «(-) EOF
创建文件, 然后根据操作提示符, 输入字符, 当系统单独捕捉到 EOF 时, 结束输入监听
« 后面加 - 之后, EOF 不需要顶行写, 兼容脚本产生的制表符