当前位置: 代码迷 >> 综合 >> sh脚本-更新文本内容示例以及解析
  详细解决方案

sh脚本-更新文本内容示例以及解析

热度:51   发布时间:2023-09-29 07:14:34.0

示例

先看一个示例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=$3if [[ $1 = "--help" ]] || [[ $1 = "-h" ]]; thenecho " e.g: bash update.sh {Xmn}M {Xms}M {Xmx}M"exit 0
fiif [ $# != 3 ]; thenecho "invalid params"echo " e.g: bash update.sh {Xmn}M {Xms}M {Xmx}M"exit 1;
fido_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 $DIR2PARAM_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}   将制定的语句替代文本的指定行数据。

 

 

 

 

  相关解决方案