Shell如何提取外部文件两模式间内容并执行其中curl命令
Shell脚本提取并执行指定区间curl命令修复方案
原有脚本核心问题
- 关键词拼写不匹配:case分支写的是
loresipsum,和test.txt内的边界标记前缀loremipsum不一致,输入正确关键词也无法命中对应分支 - sed区间逻辑缺陷:原有规则从起始标记一直读到文件末尾,会把边界标记行本身、后续其他块的无关内容都输出,没有过滤空行
- 输入流冲突:sed通过管道给while传内容的同时,又给while加了
< $testfile重定向,重定向优先级高于管道,导致while直接读取整个test.txt文件,完全忽略sed提取的内容 - 逻辑错误:
echo "makingcurlCall"写死固定字符串,既不打印当前执行的命令,也不输出执行结果;默认分支变量引用漏了$,永远打印字面量:instance,无法回显用户输入
修复后完整代码
#!/bin/bash read -p "Enter a word: " instance testfile="test.txt" case $instance in loremipsum|foobar) # 提取两个边界标记之间的有效内容,排除标记行、空行 sed -n "/^${instance}1/,/^${instance}2/{ /^${instance}1/d /^${instance}2/d /^[[:space:]]*$/d p }" "$testfile" | while read -r line; do echo "当前执行命令: $line" makingcurlCall=$(eval "$line") echo "命令执行返回: $makingcurlCall" echo "----------------------------------------" done ;; *) printf 'No match for "%s"\n' "$instance" esac
代码逻辑说明
- 合并了逻辑完全一致的两个关键词分支,减少冗余代码
- sed规则精准匹配
关键词1到关键词2的闭合区间,直接删除首尾边界标记行、无内容的空白行,仅输出有效curl命令 - 移除了while循环多余的文件重定向,确保循环读取的是sed过滤后的有效命令行
- 执行命令前打印当前命令内容,执行后输出返回结果,方便排查执行问题
- 修正默认分支的变量引用,未匹配时正确回显用户输入的关键词
新增其他关键词匹配规则时,直接在case第一个分支的匹配列表追加对应关键词即可,无需重复编写处理逻辑。
内容的提问来源于stack exchange,提问作者Rav
相关产品推荐
相关产品推荐

