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

时间:2015-07-03 11:13:15

标签: linux bash

我已经创建了一个脚本,可以轻松设置多个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

有三个要求

计划是在文件中包含大量这些内容,然后使用每个数据行运行整个脚本(见下文)

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

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

我该怎么做?

3 个答案:

答案 0 :(得分:1)

将数据文件中的分隔符设置为空格。您通常可以避免使用逗号 - 它们在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…' "$@" | while read new ip domain可以完成这项工作。

答案 1 :(得分:0)

您可以使用read

while IFS=', ' read -r new ip domain ; do
    ./your_script "$new" "$ip" "$domain"
done < input.file

答案 2 :(得分:0)

您需要在运行之前将变量导出到脚本中,如:

-p

或者使用hek2mgl的方法将值作为参数传递并将其添加到脚本的开头:

while IFS=', ' read -r new ip domain ; do
    export new ip domain
    ./your_script
done < input.file