gpt4 book ai didi

linux - 读取文件 "$"数据和 bash 脚本

转载 作者:太空宇宙 更新时间:2023-11-04 10:50:35 25 4
gpt4 key购买 nike

我创建了一个脚本,可以轻松设置多个 Postfix 并分配一些东西。

比如有一部分是

postmulti -e init
postmulti -I postfix-$new -e create
echo "mydomain = $domain" >> /etc/postfix-$new/main.cf
echo "queue_directory = /var/spool/postfix-$new" >> /etc/postfix-$new/main.cf
echo "smtp_bind_address = $ip" >> /etc/postfix-$new/main.cf
sed -i "s/oldip/$ip/g" /etc/postfix-$new/main.cf
echo "/n*@$domain default._domainkey.$domain" >> /etc/opendkim/SigningTable
sed -i "s/cyberciti.com/$domain/g" /etc/postfix-$new/main.cf

这个脚本有三个需求$new $ip$domain

计划是在一个文件中包含很多这样的内容,然后 bash 将为每个数据行运行的整个脚本(见下文)

new1, 1.1.1.1, myweb.com
new2, 2.2.2.2, myweb2.com

目前由 , 分隔,但我可以将其设置为任何值

我该怎么做?

最佳答案

将数据文件中的分隔符设置为空格。你通常可以避免使用逗号——它们在 Unix 系统中很少有用。调用文件new_postfix_domains(为了具体讨论)。

或多或少按照以下几行编写脚本:

while read new ip domain
do
config="/etc/postfix-$new/main.cf"
postmulti -e init
postmulti -I postfix-$new -e create
echo "/n*@$domain default._domainkey.$domain" >> /etc/opendkim/SigningTable
{
echo "mydomain = $domain"
echo "queue_directory = /var/spool/postfix-$new"
echo "smtp_bind_address = $ip"
} >> "$config"
sed -i -e "s/oldip/$ip/g" \
-e "s/cyberciti.com/$domain/g" "$config"
done

运行脚本:

bash add_new_postfix_domains.sh < new_postfix_domains

注意事项:

  1. 该脚本使用 { … } > "$config" 符号将配置文件的多个输出组合成一个操作序列。请注意,{} 的句法要求有些特殊。 { 必须是一个单独的词(被空格包围),而 } 必须是一个单独的词,命令可以从哪里开始(例如在一个命令的开头)行,或在分号之后)。

  2. 您只需使用 sed 编辑文件一次。我假设 postmulti … create 步骤使用需要编辑的模板创建了配置文件。否则,sed 命令没有任何意义。

  3. 使用变量捕获一次配置文件名;此后使用变量来引用文件。

  4. 您应该考虑各种形式的数据验证。例如,这将接受数据中的一个空行,并为各种组件创建一个包含空白的条目。也许您应该稍微验证一下 IP 地址,也许还应该验证一下域名。如果数据文件可能被搞砸了,您可能需要在 read 中添加一个额外的“列”:read new ip domain junk 其中在 中捕获垃圾>$junk 并忽略(或在该行被忽略之前报告)。

  5. 您可能想报告您正在做的事情。

  6. 有些人会争辩说您应该使用 read -r 而不是仅仅 read 以便以不同方式处理古怪的输入。我认为这在这里不相关 — GIGO如果使用该脚本的人应该是理智的,并且最好是知识渊博的,那么这是合理的。如果您愿意,可以预先验证输入数据。例如,您可以使用 sed 对输入进行预处理,弹出任何与三个字段不匹配的行,中间字段是 IPv4 地址,最后一个是合理的域名,第一个是标识符没有不当标点符号的要求。

  7. 您可以修改脚本以从文件名参数列表中读取,或者如果命令行中未提供名称,则从标准输入中读取。如果您预先过滤输入,那将是微不足道的: sed -e '…editing script…' "$@"|而读取新的 ip 域 就可以完成这项工作。

关于linux - 读取文件 "$"数据和 bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31205455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com