在shell脚本中附加额外的单引号

时间:2017-10-12 05:56:45

标签: shell

我正在尝试编写一个简单的脚本,将iptables规则从文件加载到iptables:

#!/bin/bash
set -euxo pipefail
test_file="test.conf"
while read line; do
    echo $line
    echo "-----"
    iptables $line
done < $test_file

test.conf里面有一些规则:

-A INPUT -p tcp -m tcp --dport 123 -m comment --comment "test 1" -j ACCEPT
-A INPUT -p tcp -m tcp --dport 112 -m comment --comment "test 2" -j ACCEPT
-A INPUT -p tcp -m tcp --dport 1231 -m comment --comment "test 3" -j ACCEPT

但是当我运行脚本时,它会返回错误:

+ test_file=rules.conf
+ read line
+ echo -A INPUT -p tcp -m tcp --dport 123 -m comment --comment '"test' '1"' 
-j ACCEPT
-A INPUT -p tcp -m tcp --dport 123 -m comment --comment "test 1" -j ACCEPT
+ echo -----
-----
+ iptables -A INPUT -p tcp -m tcp --dport 123 -m comment --comment '"test' 
'1"' -j ACCEPT
Bad argument `1"'

看起来每当文件运行时,如果字符串中有空格,它将有一个单独的引号来环绕空格。

有没有办法摆脱这种行为?

1 个答案:

答案 0 :(得分:1)

最后一行是主要问题。 shell在变量扩展期间不解释引号。如果您将其更改为

eval iptables $line

你应该得到(大致)正确的结果。

您的阅读声明也可能存在问题,因为您没有先将IFS设置为换行符。这可能导致多个空格被折叠以及其他可能不合需要的行为。 我将从

开始
IFS="
"

或类似。