示例
先看一个示例update.sh,这个示例的目的是入三个参数 用来更新同一个目录下的service.sh中的三个参数(_Xmn、_Xms、_XmX)的值。用于实际项目中可以通过代码执行脚本来调整项目Jvm的堆大小等.
#!/bin/bash
#获取文件的当前路径
DIR="$( cd "$(dirname "$0")" && pwd )"
#待修改文件路径
EXEC_PATH="${DIR}/service.sh"
#jvm xmn值-第一个参数
_PARAM_XMN=$1
#jvm xms值 第二个参数
_PARAM_XMS=$2
#jvm xmx值 第三个参数
_PARAM_XMX=$3
if [[ $1 = "--help" ]] || [[ $1 = "-h" ]]; then
echo " e.g: bash update.sh {Xmn}M {Xms}M {Xmx}M"
exit 0
fi
if [ $# != 3 ]; then
echo "invalid params"
echo " e.g: bash update.sh {Xmn}M {Xms}M {Xmx}M"
exit 1;
fi
do_exec()
{
XMN_INDEX=$(grep -n "_Xmn=" service.sh |awk -F ":" '{print $1}')
sed -i "${XMN_INDEX}c _Xmn=${_PARAM_XMN}" ${EXEC_PATH}
XMS_INDEX=$(grep -n "_Xms=" service.sh |awk -F ":" '{print $1}')
sed -i "${XMS_INDEX}c _Xms=${_PARAM_XMS}" ${EXEC_PATH}
XMX_INDEX=$(grep -n "_Xmx=" service.sh |awk -F ":" '{print $1}')
sed -i "${XMX_INDEX}c _Xmx=${_PARAM_XMX}" ${EXEC_PATH}
echo "success!"
}
do_exec
shell脚本的 $常用含义:
$( ) 和 ${ }:
$( ) 中放的是命令,可以使用 “” 包起来,也可以不包。例如:DIR="$(cd "$(dirname "$0")" && pwd)" 或者 DIR1=$(cd "$(dirname "$0")";pwd) 或者 DIR1=$(cd $(dirname "$0");pwd) 或者 DIR1=$(cd $(dirname $0);pwd) 都是一样的输出结果 都是获取当前执行脚本的路径。命令也等价于‘’。但是在一个嵌套名命令中使用‘’会很麻烦。
${ }中放的是变量,例如 echo ${PARAM} 取PARAM变量的值并打印,也可以不加括号如 $PARAM。
$0,$?,$!等用法:
$0 表示当前脚本的执行名字 例如 ./test.sh start 。则 $0 的结果是 ./test.sh
$n 获取shell脚本运行输入的第n个参数值,n=1..9
$# 获取运行时传入的参数个数
$$ 获取脚本运行的当前进程ID号
$! shell后台运行的最后一个进程的进程ID号
$? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
$- 显示shell使用的当前选项,与set命令功能相同,如*表示所有参数列表。以"$1$2…$n"的形式输出所有参数。@表示参数所有列表。如@所有参数列表。如@表示所有参数列表。以"$1","$2"…"$n"的形式输出所有参数。
$@ 取当前shell的所有参数(强调个体), 参数之间保留参数里的空白,相当于“$“ ”$2”..."$n",这是将参数传递给其他程序的最佳方式。
$* 获取当前shell的所有参数(强调整体),将所有的命令行视为单个字符串,以"$1 $2 … $n"的形式输出所有参数。此选项参数可超过9个。
示例以及结果:
test.sh
DIR="$(cd "$(dirname "$0")" && pwd)"
echo $DIR
DIR1=$(cd "$(dirname "$0")";pwd)
echo $DIR1
DIR2=$(cd $(dirname $0);pwd)
echo $DIR2
PARAM_SIZE=$#
echo $PARAM_SIZE
PARAM_1=$1
echo $PARAM_1
PARAM_2=$2
echo ${PARAM_2}
ALL_PARAM_2=$*
echo $ALL_PARAM_2
ALL_PARAM_1=$@
echo $ALL_PARAM_1
echo $0
运行: ./test.sh 111 222 333
结果:
/home/hik/test
/home/hik/test
/home/hik/test
3
111
2222
111 2222 33333
111 2222 33333
./test.sh
DIR = $(cd "$(dirname "$0")";pwd) 解析:
1、取当前运行脚本的所在路径: $0
2、取当前脚本所在路径的父目录: dirname "$0"
3、取返回的父目录的值: $(dirname "$0")
4、cd到返回的父目录: cd "$(dirname "$0")"
5、输出地址: cd "$(dirname "$0")";pwd
6、取输出的地址,并赋值给DIR : DIR = $(cd "$(dirname "$0")";pwd)
XMN_INDEX=$(grep -n "_Xmn=" service.sh |awk -F ":" '{print $1}')
grep -n "_Xmn" : 搜索"_Xmn="字符串所在的行,并且输出行号和内容。 结果示例: 9:_Xmn=123M
awk -F ":" '{print $1}') :以grep的输出为输入 解析数据-以分号非分隔符,打印解析后的第一列数据(数据所在的行号9)
sed -i "${XMN_INDEX}c _Xmn=${_PARAM_XMN}" ${EXEC_PATH}
sed -i "9c _Xmn==${_PARAM_XMN}" ${EXEC_PATH} 将制定的语句替代文本的指定行数据。