文章目录
概述
清空目标文件并将新内容写入文件并保存。
向目标文件中追加新的内容并保存。
传参指定修改内容将目标文件中指定内容进行修改并保存。
传递K-V参数给脚本进行修改目标文件中的指定V值。
传递old-string和new-string将目标文件中old-string内容进行替换。
将传递参数修改为一个配置文件,每次执行时默认读取配置文件根据区中的内容修改对应的文件信息。
添加条件判断,满足条件时执行5的操作。
补充知识
条件判断
整数比较符
字符串比较符
文件测试
布尔运算符
逻辑判断符
整数运算符
其他运算符
if语句
单分支
多分支
多分支
参考链接
概述
- 在Linux下经常会遇到需要使用脚本来自动修改配置文件内容的需求,针对这种情况,特别整理了这样几种可以使用的方式方法。(以下几种方式由简入难)
- 1、清空目标文件并将新内容写入文件并保存。
- 2、向目标文件中追加新的内容并保存。
- 3、传参指定修改内容将目标文件中指定内容进行修改并保存。
- 4、将传递参数修改为一个配置文件,每次执行时默认读取配置文件根据区中的内容修改对应的文件信息。
- 5、添加条件判断,满足条件时执行4的操作。
- 注:下面开始实现上述要求的方式方法,约定以下几个文件和文件名:/cfg/target.t(目标文件,/cfg为路径)、/cmd/cmd.sh(执行的shell脚本,/cmd为路径)、cmd.cfg(执行shell脚本相应的配置文件)
- 文件目录参考:
. └── cfg_demo ├── cfg(修改目标目录) │ ├── bak_target.t(备份的目标文件) │ └── target.t(目标文件) └── cmd(shell脚本目录) ├── cmd.cfg(shell脚本对应的配置文件) └── cmd.sh(shell脚本) 3 directories, 4 files
清空目标文件并将新内容写入文件并保存。
- 用到的命令有
:>${target_file}; #清空目标文件内容 cat ${cmd_cfg} > ${target_file} #使用cat命令将配置文件内容取出重定向到目标文件中
- 当前目标文件target.t文件中的内容如下:
# interfaces(5) file used by ifup(8) and ifdown(8) auto eno1 iface eno1 inet dhcp pre-up ifconfig eno1:0 192.168.0.139 up ifconfig eno1:0 192.168.0.139 auto lo iface lo inet loopback
- 执行如下shell命令情况目标文件并将设置好的内容填充进空文件中并保存。
#!/bin/bash target_file=../cfg/target.t echo "start clear target file message!" :>${target_file}; #清空目标文件内容 echo "clear end." echo "start input message to target file." # 逐行将内容插入目标文件中 echo "auto eno1" >> ${target_file}; echo "iface eno1 inet dhcp" >> ${target_file}; echo "pre-up ifconfig eno1:0 192.168.0.111" >> ${target_file}; echo "up ifconfig eno1:0 192.168.0.111" >> ${target_file}; echo "new file message input end." echo "please look over target file"
- 从上面打印信息及最后查看的结果能看出是可以这么做的,但是有点蠢啊。
- 而且内容是写死的。顺便实现了将cmd.cfg的内容放到目标文件中的功能。脚本内容如下:
- 使用cat命令将配置文件内容取出重定向到目标文件中
#!/bin/bash target_file=../cfg/target.t cmd_cfg=./cmd.cfg echo "start clear target file message!" :>${target_file}; echo "clear end." echo "start input message to target file." cat ${cmd_cfg} > ${target_file} #使用cat命令将配置文件内容取出重定向到目标文件中 echo "please look over target file"
向目标文件中追加新的内容并保存。
- 追加内容只需要使用>>追加重定向即可。
- shell脚本内容如下:
#!/bin/bash target_file=../cfg/target.t cmd_cfg=./cmd.cfg echo "start append message to target file." cat ${cmd_cfg} >> ${target_file} #追加重定向到目标文件 echo "please look over target file"
传参指定修改内容将目标文件中指定内容进行修改并保存。
- 这个需求就有点难度了,首先需要传递K-V参数给脚本,脚本读取K-V参数对到目标文件中将K对应的参数修改为传递的参数V即可。
- 此外还有一种可能是传递参数为将指定字符串替换为新的字符串。
- 针对以上两种情况分别进行两种不同的脚本。
传递K-V参数给脚本进行修改目标文件中的指定V值。
- 查询目标文件某一行并替换
sed -i "s/^.*${key}.*$/${key}=${value}/" ${target_file}
- shell脚本接受K-V参数方式:
while getopts ":k:v:" opt do case $opt in k) echo "参数key的值$OPTARG" key=$OPTARG ;; v) echo "参数value的值$OPTARG" value=$OPTARG ;; ?) echo "未知参数" exit 1;; esac done echo "参数key的值$key" echo "参数value的值$value"
- 将目标文件修改为以下配置文件格式的内容:
serverip=192.168.0.1 serverport=8899 addrip=192.168.0.122 addrport=6666
- shell脚本内容为:
#!/bin/bash target_file=../cfg/target.t cmd_cfg=./cmd.cfg echo "start append message to target file." echo "please look over target file" while getopts ":k:v:" opt do case $opt in k) echo "参数key的值$OPTARG" key=$OPTARG ;; v) echo "参数value的值$OPTARG" value=$OPTARG ;; ?) echo "please input" echo "./cmd.sh -k key -v value" exit 1;; esac done sed -i "s/^.*${key}.*$/${key}=${value}/" ${target_file} echo "replace success."
传递old-string和new-string将目标文件中old-string内容进行替换。
- 使用sed命令:
sed -i "s/$1/$2/g" ${target_file} # 将target_file目标文件中的$1字符串替换成$2字符串
- 使用方式为
./cmd.sh old-string new-string
- 脚本内容如下:
#!/bin/bash target_file=../cfg/target.t cmd_cfg=./cmd.cfg echo "start append message to target file." sed -i "s/$1/$2/g" ${target_file} echo "please look over target file"
将传递参数修改为一个配置文件,每次执行时默认读取配置文件根据区中的内容修改对应的文件信息。
- 这里的需求比前一步多了一个读取配置文件中的K-V对的值。只需要循环执行上一步的流程即可。读取K-V对的方式有两种,如下:
• 第一种方式:
IFS='=' while read k v do echo "$k : $v" done < ${cmd_cfg}
第二种方式:
while read line do k=${line%=*} v=${line#*=} echo "$k : $v" done < ${cmd_cfg}
两种方法都可以使用。
执行脚本内容为:
#!/bin/bash target_file=../cfg/target.t cmd_cfg=./cmd.cfg IFS='=' while read k v do echo "$k : $v" done < ${cmd_cfg} while read line do key=${line%=*} value=${line#*=} echo "$key : $value" sed -i "s/^.*${key}.*$/${key}=${value}/" ${target_file} done < ${cmd_cfg} echo "replace success."
添加条件判断,满足条件时执行5的操作。
- 条件判断的话只不过是进行一下shell脚本的条件执行语句即可,目前做的是判断当前目录下有没有cmd.cfg文件,如果有的话就读取其中的参数替换目标文件中的对应参数即可。
- 执行脚本内容如下:
#!/bin/bash target_file=../cfg/target.t cmd_cfg=./cmd.cfg if [ -f ${cmd_cfg} ];then echo "cfg file yes." while read line do key=${line%=*} value=${line#*=} echo "$key : $value" sed -i "s/^.*${key}.*$/${key}=${value}/" ${target_file} done < ${cmd_cfg} echo "replace success." else echo "cfg file is no." fi