#!/bin/bash
JAR_NAME=demo.jar
start() {
begin=`date +%s`
nohup java -jar "$JAR_NAME" 2>&1 &
i=0
while [ 1 ]
do
PID=$(ps -ef | grep "$JAR_NAME" | grep -v grep | awk '{print $2}')
if [[ -n $PID ]]; then
array=(${PID//\n/ })
if test $[i] -eq 0; then
echo -ne "${#array[*]} $JAR_NAME is running\r"
else
echo -ne "${#array[*]} $JAR_NAME has been running for $i seconds\r"
fi
else
end=`date +%s`
duration=$[ $end - $begin ]
echo -e "\nFinished in $duration seconds."
exit
fi
sleep 1
i=`expr $i + 1`
done
}
stop() {
PID=$(ps -ef | grep "$JAR_NAME" | grep -v grep | awk '{print $2}')
if [[ -n $PID ]]; then
for item in $PID
do
kill -9 $item
echo "kill -9 $item"
done
else
echo "$JAR_NAME not running."
fi
}
tips() {
echo "-------------------------------------"
echo ""
echo "sh $0 [commands]"
echo ""
echo "Support commands :"
echo "start -启动当前项目"
echo "stop -停止当前项目"
echo ""
echo "-------------------------------------"
}
case "$1" in
"start")
start
;;
"stop")
stop
;;
*)
tips
;;
esac
执行sh demo.sh start
启动命令:
执行 sh demo.sh stop
停止命令:
执行停止命令后:
接下来,我为大家解析一下脚本中的代码。
源码细节解析 Shell变量定义变量:
JAR_NAME=demo.jar
Shell中的“switch ... case”注意点:不要把写C/C++/Java定义变量时留空格的习惯带到编写 shell 脚本中来。
,在JAR_NAME = demo.jar
=
前后留空格是定义 shell 变量的大忌,会抛出 JAR_NAME: command not found 这样的错误。
显然,你在 JAR_NAME 后面留空格,Bash 把它当做命令来执行,= 和 demo.jar 被看作命令的参数了。
case ... esac 为多选择语句,与其他语言中的 switch ... case 语句类似,是一种多分支选择结构。
每个 case 分支用右圆括号开始,用两个分号;;
表示break
,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。
case ... esac 语法格式如下:
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
如果值无法匹配模式,使用星号
*
捕获该值,再执行后面的命令。因此,我们简化一下上面的代码并保存在test.sh
中:
#!/bin/bash
case "$1" in
start)
echo start
;;
stop)
echo stop
;;
*)
echo others
;;
esac
实验结果如下,除了
sh test.sh start
和sh test.sh stop
,其他参数都会进入*
分支内。
[geekziyu@mylinuxhost ~]$ sh test.sh
others
[geekziyu@mylinuxhost ~]$ sh test.sh start
start
[geekziyu@mylinuxhost ~]$ sh test.sh stop
stop
单引号''和双引号""
看我的代码,我有时候会写单引号
''
,有时候会写双引号""
,有时候又不写。
这是不是和你们学习 javascript 或者其他语言,定义字符串的方式有些不同呢?
接下来,看一个例子,了解啥时候要加引号,啥时候不加引号?
。
#!/bin/bash
name=geekziyu
echo hello $name
echo 'hello $name'
echo "hello $name"
执行
sh test.sh
执行结果为:
hello geekziyu
hello $name
hello geekziyu
echo -ne "\r"对于本例而言,这里的双引号完全可以省略,第一条命令
echo hello $name
与第三条命令echo "hello $name"
效果一致。
简化一下代码量:
#!/bin/bash
JAR_NAME=demo.jar
echo -ne "$JAR_NAME is running\r"
sleep 1
echo -ne "$JAR_NAME has been running for 1 seconds\r"
sleep 1
echo -ne "\n"
效果如下图:
点击了解更多 echo -ne 的命令效果
``和$() 用语句给变量赋值显示地给变量直接赋值,比如 val=123
;
除此以外,还可以用语句给变量赋值:
#!/bin/bash
begin=`date +%s`
echo $begin
i=0 #输出结果例如 1653223046
i=`expr $i + 1`
echo $i #输出结果 1
计算数组长度 ${#array[*]}了解更多 菜鸟教程 Shell 变量
了解更多 菜鸟教程 Shell 基本运算符 算数运算符 及 表达式计算工具 expr
Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:
array_name=(value1 value2 ... valuen)
#!/bin/bash
array=(1 2 3)
echo "数组长度等于 ${#array[*]}" # 数组长度等于 3
echo "数组长度等于 ${#array[@]}" # 数组长度等于 3
$0表示脚本文件名称了解更多 菜鸟教程 Shell 数组
本文源码中用到了代码 echo "sh $0 [commands]"
$0
Shell本身的文件名
./test.sh 1
test.sh
$1~$n
添加到Shell的各参数值。$1
是第1个参数、$2
是第2个参数…
./test.sh 1 2
$1
值等于1$2
值等于2
分隔字符串参考自 linux shell $0怎么输出,linux shell中
$0
,$?
,$!
等的特殊用法
awk有内置的变量。对于每一个记录,即行,分隔空白字符分隔记录默认情况下,它存储在$1..$n
变量。如果该行有4个词,它会被存储在$1
,$2
,$3
,$4
。$0表示整行。
awk '{print $2}'
表示打印每一行的第二列,行与行之间肯定是用换行符\n
作为分隔符。
${parameter//pattern/string}
用 string 来替换 parameter 变量中所有匹配的 pattern。
本例中${PID//\n/ }
就是把换行符 \n
替换成为空格
。
然后,array=(${PID//\n/ })
外层的 array=(value1 value2 value3)
就是普通的数组赋值操作了。
shell变量 字符串替换了解更多 【shell】shell字符串分割|文件分割|剪切|截取
了解更多 Shell awk命令详解(格式+使用方法)
用 string 来替换第一个匹配的pattern
${parameter/pattern/string}
从开头开始匹配 parameter 变量中的 pattern,匹配上后就用 string 来替换匹配的 pattern (仅替换第一个匹配到的 pattern)
${parameter/#pattern/string}
从结尾开始匹配 parameter 变量中的 pattern,匹配上后就用 string 替换匹配的 pattern (仅替换第一个匹配到的 pattern)
${parameter/%pattern/string}
用 string 来替换 parameter 变量中所有匹配的 pattern
${parameter//pattern/string}
了解更多 shell变量的子串的删除/替换