..

分析一段 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}” = “” ]