免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3518 | 回复: 7
打印 上一主题 下一主题

[文本处理] 求助字段串中包含变量,命令,转义,管道, 解析该字符串,替换字符串中变量为值 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-29 10:02 |只看该作者 |倒序浏览
5可用积分
操作系统: Suse linux
语言:bash

场景:
   我会从文件中读取一条字符串,这条字符串是用户配置的命令行, 命令行中可能包含环境变量,命令,参数,转义,管道,重定向等特殊符号;

   我现在要做的是把这条字符串中的变量替换成值, 而其它的值保留下来, 转换后的字符串去送给bash执行;  

   当前我尝试过用eval解析, 但是eval完成变量转换之后遇到管道,就真当做管道来执行了,, 请问各位有什么好的办法?

例如下面代码, cmd_str分别是从配置文件中读取出来的命令行, 需要对里面的变量转换成执行,再送给bash执行
  1. vBackupHome=/export/home/sysm/backup
  2. vLogFile=/export/home/sysm/logs/a.log

  3. cmd_str='find ${vBackupHome}/data/common/datafile -maxdepth 2 -type d | xargs -i chmod 700 {}'
  4. echo "${cmd_str}" | bash

  5. cmd_str='find ${vBackupHome}/data/common/datafile -maxdepth 2 -type d  -exec chmod 700 {} \;'
  6. echo "${cmd_str}" | bash

  7. cmd_str='find ${vBackupHome}/data/common/datafile -maxdepth 2 -type d  >> ${vLogFile}'
  8. echo "${cmd_str}" | bash
复制代码

最佳答案

查看完整内容

回复 4# legone2008 1、 eval echo \"$cmd_str\"2、 eval $cmd_str

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
2 [报告]
发表于 2015-01-29 10:02 |只看该作者
回复 4# legone2008


1、  eval echo \"$cmd_str\"

2、  eval $cmd_str

论坛徽章:
7
申猴
日期:2014-12-21 13:57:24巳蛇
日期:2014-12-25 22:27:08申猴
日期:2015-01-19 08:07:36辰龙
日期:2015-02-04 11:40:06处女座
日期:2015-02-04 11:40:412015年亚洲杯之卡塔尔
日期:2015-03-06 12:01:322015年亚洲杯之乌兹别克斯坦
日期:2015-03-31 13:43:57
3 [报告]
发表于 2015-01-29 10:16 |只看该作者
但是eval完成变量转换之后遇到管道,就真当做管道来执行了

你不想当成管道执行吗?

论坛徽章:
7
申猴
日期:2014-12-21 13:57:24巳蛇
日期:2014-12-25 22:27:08申猴
日期:2015-01-19 08:07:36辰龙
日期:2015-02-04 11:40:06处女座
日期:2015-02-04 11:40:412015年亚洲杯之卡塔尔
日期:2015-03-06 12:01:322015年亚洲杯之乌兹别克斯坦
日期:2015-03-31 13:43:57
4 [报告]
发表于 2015-01-29 10:22 |只看该作者
  1. cat t1
  2. find ${path} -name "*.conf" | xargs wc -l
复制代码
  1. cat xargs.sh
  2. #!/bin/bash
  3. path="/etc"
  4. cmd=$(cat t1)
  5. eval $cmd
复制代码
  1. ./xargs.sh
  2.     64 /etc/sane.d/umax_pp.conf
  3.      3 /etc/sane.d/tamarack.conf
  4.     17 /etc/sane.d/cardscan.conf
  5. 。。。。。。
复制代码

论坛徽章:
0
5 [报告]
发表于 2015-01-29 10:27 |只看该作者
回复 3# goofool

可能我没有表述清楚, 实际上我需要分两步来实现命令的执行

第一步:我需要把解析出来的完整命令打印出来 。 这个命令是替换了里面的变量后的结果, 但是管道,命令等符号要保留

第二步:我才去执行这个解析后的命令
   

论坛徽章:
7
申猴
日期:2014-12-21 13:57:24巳蛇
日期:2014-12-25 22:27:08申猴
日期:2015-01-19 08:07:36辰龙
日期:2015-02-04 11:40:06处女座
日期:2015-02-04 11:40:412015年亚洲杯之卡塔尔
日期:2015-03-06 12:01:322015年亚洲杯之乌兹别克斯坦
日期:2015-03-31 13:43:57
6 [报告]
发表于 2015-01-29 11:36 |只看该作者
回复 4# legone2008


    这样就用m4吧
  1. cat t1
  2. find m4_path -name "*.conf" | xargs wc -l
复制代码
  1. cat xargs.sh
  2. #!/bin/bash
  3. path="/etc"
  4. cmd=$(m4 -Dm4_path=$path t1)
  5. echo $cmd
  6. eval $cmd
复制代码

论坛徽章:
0
7 [报告]
发表于 2015-01-29 15:21 |只看该作者
感谢  goofool

你后面的方法我没有尝试, 是因为 6楼的方法更通俗易懂些;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP