..
分析一段 shell 脚本[update]
很久没写shell脚本了,学习一下同事写的一个修改toml文件的shell脚本,算是自己的一个复习。 首先该脚本使用如下
./change.sh config.toml
change.sh 代码如下,顺便加上自己的注释
#!/bin/bash
# $1 表示该脚本接收的第一个参数;(扩展一下:$0表示脚本本身、$2表示第二个参数)
CONF=$1
# 定义一个方法
set_key_value[^1]() {
# local 变量 . (扩展一下:默认 shell 中变量是 global)
# ${1} 该方法的第一个参数
local key=${1}
# ${2} 该方法的第二个参数
local value=${2}
# [ -n STRING ] 如果STRING的长度非零则为真 ,即判断是否为非空,非空即是真;
if [ -n $value ]; then
#echo $value
# sed -n -n 寂静模式,抑制来自sed命令执行过程中的冗余输出信息,比如只显示那些被改变的行。
# se -e -e script 指定sed编辑命令
# 替换命令用替换模式替换指定模式,格式为:s/pattern-to-find/replacement-pattern/[g p w n] -p 打印匹配行
#
# sed
#
# ^ 行开始 、 $ 行结束
# \2 表示 前面的第二部分内容
local current=$(sed -n -e "s/^\($key = '\)\([^ ']*\)\(.*\)$/\2/p" $CONF) # value带单引号
# 判断 $current 是否未空???
# 这个地方,${current} 是不是应该加上 "", 即 "${current}" ,否则 即使 ${current} 为空,也会进入!!!
if [ -n $current ]; then
echo "setting $CONF : $key = $value"
# 去掉多余的双引号???
value="$(echo "${value}" | sed 's|[&]|&|g')"
# value="$(echo "${value}" | sed 's|[&]|\\&|g')"
# key = value 写进 CONF
sed -i "s|^[#]*[ ]*${key}\([ ]*\)=.*|${key} = \"${value}\"|" ${CONF}
fi
fi
}
set_key_value timeout_propose "4s"
以上主要是复习 shell 的基本语法 和 sed 的使用。 其中 awk / sed / grep 算是Linux三件套,之前使用的很溜,时间一长就丢了,也就是 grep 一直在用。
其实上面三个 sed 指令没有完全明白。。。,打个tag吧。
shell 变量判空的方法:
- if [ ! ${xx} ]; then
- if [ ! -n “${xxx}” ]
- if [ “${xxx}” = “” ]