不久以前,以前搜到一篇博客是读取配置文件的,http://www.cnblogs.com/bo083/archive/2012/11/19/2777076.html,用到如今,感觉十分方便。感谢作者。

如今,须要通过web界面给用户留出接口来改动类似配置文件,大的方法是从php调用linux shell script,于是,如今贴一个能够改动此种配置文件的linux shell。

首先,配置文件的格式例如以下:

[unit1]
field1=value1
field2=value2 [unit2]
field1=value3
field3=value4 ...
...

样例例如以下,config.ini:

[DATABASE]
dbms_ip=localhost
user=root
passwd=cloud
db_name=cloud
port=2394 [BUSINESS]
port=9084 [OFFLINE]
pcap_file=test.pcap

配置文件里包括3个unit。表示3个大的方面:数据库,业务,离线;每一个unit有属于自己的字段名及字段值。

上文中引用博客正是能读取这种配置文件。而眼下我们便是要通过linux shell来改动这个配置文件。

我们设计的程序名为 modify_config_file,使用 ./modify_config_file unit1-field1=changed_value1 unit2-field1=changed_value2 这种格式(參数能够继续加入)来进行改动。

要做到改动配置文件的功能事实上并不难,20-30行便能够解决这个问题。

可是基于“一切输入都是有害的”的原则,须要在shell中增加各种容错处理,假设用户參数输入错误,要能及时提醒用户。定位问题所在。以下是基于这样一个初衷的shell。当然,名称为modify_config_file:

#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
export PATH #Program
# This program is to modify the configuration file
#History
# 2014.10.30 WeiZheng 1.1 MY_HOME="/home/weizheng/10-30-yg/yg-soft"
CONFIG_FILE="$MY_HOME/config.ini"
ERROR_NUM=255 function get_line_num()
{
# Check if the argument name has the separator "-" that separate the argument unit and argument field
separator=$(echo $1 | grep "-")
if [ -z "$separator" ]; then
echo -e "error: \"$1\": argument name has no separator \"-\" that separate the argument unit and argument field"
exit $ERROR_NUM
fi # Check if the argument name has argument unit and argument field
arg_unit=$(echo $1 | cut -d "-" -f 1)
arg_field=$(echo $1 | cut -d "-" -f 2)
if [ -z "$arg_unit" -o -z "$arg_field" ]; then
echo -e "error: \"$1\": argument name has no argument unit or argument field around \"-\""
exit $ERROR_NUM
fi # Get the argument unit's interval [$arg_unit_line_num, $next_neighbour_unit_line_num)
arg_unit_line_num=$(grep -n "\[$arg_unit\]" $CONFIG_FILE | cut -d ":" -f1)
if [ -z "$arg_unit_line_num" ]; then
echo -e "error: \"$arg_unit\": can not find argument unit"
exit $ERROR_NUM
fi next_neighbour_unit_line_num=$(awk "NR>$arg_unit_line_num && /^\[.*\]/ {print NR; exit 0}" $CONFIG_FILE)
if [ -z "$next_neighbour_unit_line_num" ]; then
file_line_count=$(wc -l $CONFIG_FILE | cut -d " " -f 1)
next_neighbour_unit_line_num=$((file_line_count+1))
fi
echo "argument unit interval: ($arg_unit_line_num, $next_neighbour_unit_line_num)" arg_field_line_nums=$(grep -n "^$arg_field=" $CONFIG_FILE | cut -d ":" -f1 | tr "\n" "\ ")
if [ -z "$arg_field_line_nums" ]; then
echo -e "error: \"$arg_field\": can not find argument field"
exit $ERROR_NUM
fi
echo "matched argument field in line: $arg_field_line_nums" # the $arg_field_line_num must in the interval ($arg_unit_line_num, $next_neighbour_unit_line_num)
for arg_field_line_num in $arg_field_line_nums
do
if [ $arg_field_line_num -gt $arg_unit_line_num -a $arg_field_line_num -lt $next_neighbour_unit_line_num ]; then
echo "find argument field in line: $arg_field_line_num"
return $arg_field_line_num
fi
done # if not return in for-loop, the arg_field_line_num is not in the interval ($arg_unit_line_num, $next_neighbour_unit_line_num)
echo -e "the argument field is not in the argument unit interval"
exit $ERROR_NUM
} while [ "$1" ]
do
# Check if the separator "=" that separate the argument name and argument value exists
equal_symbol=$(echo $1 | grep "=")
if [ -z "$equal_symbol" ]; then
echo -e "error: \"$1\": argument has no \"=\""
exit $ERROR_NUM
fi # Check if argument name and argument value exist
arg_name=$(echo $1 | cut -d "=" -f 1)
arg_value=$(echo $1 | cut -d "=" -f 2)
if [ -z "$arg_name" -o -z "$arg_value" ]; then
echo -e "error: \"$1\": argument has no name or value around \"=\""
exit $ERROR_NUM
fi # Get the line number of the argument from CONFIG_FILE
get_line_num $arg_name
args_line_num=$? # use sed change the argument line
arg_field=$(echo $arg_name | cut -d "-" -f 2)
sed -i "${args_line_num}c $arg_field=$arg_value" $CONFIG_FILE
new_line=$(sed -n "${args_line_num}p" $CONFIG_FILE)
echo "the argument has been changed: $new_line"
shift 1
done

用户通过下面命令改动配置:

./modify_config_file BUSINESS-port=8888

输出例如以下:

argument unit interval:          (8, 11)
matched argument field in line: 6 9
find argument field in line: 9
the argument has been changed: port=8888

当中,第一行表示找到BUSINESS这个unit所在的行号区间,注意是开区间。第二行表示全部匹配到field行号。由于可能多个unit中有同样的field。第三行表示终于落入unit区间的field行号;第四行表示所在行改动后的结果。

另外,用户输入不符合格式是非常有可能。针对下面几种错误都会报告而且定位:

1. ./modify_config_file BUSINESS
error: "BUSINESS": argument has no "="
2. ./modify_config_file BUSINESS=
error: "BUSINESS=": argument has no name or value around "="
3. ./modify_config_file BUSINESS=8888
error: "BUSINESS": argument name has no separator "-" that separate the argument unit and argument field
4. ./modify_config_file BUSINESS-=8888
error: "BUSINESS-": argument name has no argument unit or argument field around "-"
5. ./modify_config_file BUSINESS-por=8888
argument unit interval: (8, 11)
error: "por": can not find argument field
6. ./modify_config_file BUSINE-port=8888
error: "BUSINE": can not find argument unit

假设要应用到其他的配置文件,须要在脚本中改动配置文件所在路径与文件名称:

MY_HOME="/home/weizheng/10-30-yg/yg-soft"
CONFIG_FILE="$MY_HOME/config.ini"

一个改动配置文件的linux shell script的更多相关文章

  1. Linux shell script All In One

    Linux shell script All In One refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  2. Linux shell Script初识

    shell secript: 执行方式的差异: ./ sh执行都是在创建一个子程序来执行,只会继承环境变量, 其中的变量如果export声明,子程序的子程序会继承,不会升级为环境变量 source 的 ...

  3. Linux Shell Script目录

    目录 Linux Shell基础 开始Shell编程 代码 示例代码查看:https://github.com/Furzoom/demo-C/tree/master/src/shell

  4. fastq to tasta using linux shell script

    #!/bin/bash usage() { echo " "; echo "############################################### ...

  5. Linux shell脚本基础学习详细介绍(完整版)二

    详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续 ...

  6. CentOS Linux下一个tomcat起停,查看日志的shell script

    CentOS 的tomcat安装目录:/usr/local/tomcat vi MyTomcatUitl.sh          创建文件chmod u+x MyTomcatUtil.sh   赋执行 ...

  7. (原创)鸟哥linux学习script shell相关笔记

    在使用鸟哥linux进行script shell学习的过程中碰到一些不太明白的知识点,在这里进行一些记录 1. [root@www scripts]# vi sh03.sh #!/bin/bash # ...

  8. linux基础之Shell Script入门介绍

    本文介绍下,学习shell script编程的入门知识,通过几个入门实例,带领大家走进shell script的神圣殿堂,呵呵,有需要的朋友参考下. 本文转自:http://www.jbxue.com ...

  9. Linux基础之-shell script(变量,运算符,流程控制,函数)

    一.shell script Shell 脚本(shell script),是一种为shell编写的脚本程序.业界所说的shell通常都是指shell脚本,但读者朋友要知道,shell和shell s ...

随机推荐

  1. JS中的import和require区别

    1.import xx from yy的方式是静态编译,即编译时加载,要写在文件的最上头,但是import()函数可以实现动态加载,写在任何地方 2.require是动态加载,即运行时加载,理论上可以 ...

  2. 后台SQL注入实例

    简要描述: 汉庭连锁酒店后台SQL注入,可绕过登陆限制进入后台,可脱库. 详细说明: 问题发生在这个站点.http://miaosha.htinns.com/ 标题内没有写具体信息.因为怕发布后被人入 ...

  3. Malware

    电脑病毒的一种, 中文名为“马威尔”, 有多种病毒变种. 1概述 Malware这个单词来自于Malicious和Software两个单词的合成,是恶意软件的专业术语,专指那些泛滥于网络中的恶意代码. ...

  4. linux下Nagios的安装和配置

    Nagios是企业普遍使用的最具影响力的网络信息监视系统之一,它可以动态监视指定的网络状态,并在状态异常时发出警告音或邮件报警通知运维人员.监控的类型和警报定时器是完全可定制的. Nagios的另一强 ...

  5. 【Hadoop】用 Ganglia 监控hadoop集群

    随着数据中心的增长和管理人员的缩减,对计算资源使用有效监视工具的需求变得比以往更加迫切.术语监视 在应用到数据中心时可能会让人混淆,因为它的含义会根据具体的说话者和听众而有所不同.例如: 在集群中运行 ...

  6. C# 代码生成器 (存储过程生成方法)

    最近研究C#,发现写代码很麻烦,特别是创建实体.模型.接口.工厂.存储过程之类,网上有些开源的,但是不完整,也不能完整的按需求生成,于是,花了三天的时候,结合前辈的一些经验,整合了一些代码生成器,以下 ...

  7. iOS学习笔记之蓝牙(有关蓝牙设备mac地址处理) 2

    1.创建中心设备,并设置代理 一般情况下,手机是中心设备,蓝牙设备是外围设备. self.centralManager = [[CBCentralManager alloc] initWithDele ...

  8. ssl生成证书

    凝雨 - Yun 快乐编程每一天 - Happy Coding Every Days HOME ARCHIVES CATEGORIES TAGS ABOUT Openssl生成自签名证书,简单步骤 P ...

  9. Unity3D研究院之IOS本地消息通知LocalNotification的使用(六十七)

    http://www.xuanyusong.com/archives/2632    现在的游戏里一般都会有本地消息,比如每天定时12点或者下午6点告诉玩家进入游戏领取体力.这种东西没必要服务器去推送 ...

  10. lodash escapeRegExp 转义正则特殊字符

    _.escapeRegExp([string='']) 转义RegExp 中特殊的字符 "^", "$", "\", ".&quo ...