使用循环在bash脚本中读取文件

时间:2014-04-13 20:11:42

标签: linux bash

给定文件 socat.conf

AUTOSTART=default

SOCAT_default="TCP4-LISTEN:3724,nodelay,fork,reuseaddr,su=nobody TCP4:your.wow.server.ip.address:3724,nodelay"

读取此文件的bash脚本的相关部分:

[ ! -f /etc/default/socat.conf ] || . /etc/default/socat.conf

start () {
    echo "Starting $DESC:"
        maxfds
        umask 027
        cd /tmp
        if test "x$AUTOSTART" = "xnone" -o -z "x$AUTOSTART" ; then
                echo "Autostart disabled."
                exit 0
        fi
        for NAME in $AUTOSTART ; do
                ARGS=`eval echo \\\$SOCAT_$NAME`
                echo $ARGS
                start_socat
                echo " $NAME $ARGS"
        done
        return $?
}

有关完整文件,请参阅此处:https://blog.bentrax.de/2009/08/26/socat-start-automatisieren-und-iptables-regeln-laden/

我的问题是,如何向socat.conf添加另一个命令?我试过

AUTOSTART=default,another

SOCAT_default="TCP4-LISTEN:3724,nodelay,fork,reuseaddr,su=nobody TCP4:your.wow.server.ip.address:3724,nodelay"

SOCAT_another="..."

然而这不起作用。我不太熟悉bash脚本来理解$ AUTOSTART循环中的NAME。我认为答案就在那里。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

for NAME in $AUTOSTART的工作原理是将$AUTOSTART拆分为使用环境变量$IFS作为分隔符的单词(默认为空格,制表符和换行符)。然后将每个单词依次存储在$NAME中并在循环内处理,直到没有单词保留。

问题的解决方案是使用空格(或制表符或换行符)来分隔您的单词:

AUTOSTART="default another"

双引号是必要的,否则它将被视为两个单独的命令AUTOSTART=defaultanother(再次因为使用IFS进行分词)。