在 shell 脚本中引入命令的变量不起作用

在 shell 脚本中引入命令的变量不起作用

这完全符合预期:

echo -n 80 443 | xargs -d ' ' -I% bash -c 'socat TCP4-LISTEN:%,fork TCP4:123.123.123.123:% &'

但这个版本不行。 $ip 变量无法传递,导致 IP 为 0.0.0.0):

ip=$(cat ip.txt)
echo -n 80 443 | xargs -d ' ' -I% bash -c 'socat TCP4-LISTEN:%,fork TCP4:$ip:% &'

我怎样才能让它按预期工作?

答案1

它不起作用,因为变量用单引号引起来。 shell 不会用单引号扩展变量,我猜当 socat 看到无效的 IP 时,它会使用 0.0.0.0

将端口和 IP 作为命令行参数传递给 bash 主体。

ip=$(< ip.txt)    # this is a bash builtin equivalent to $(cat ip.txt)
printf '%s\n' 80 443 | xargs -I% bash -c 'socat "TCP4-LISTEN:$1,fork" "TCP4:$2:$1" &' bash % "$ip"

第二个“bash”被分配给 $0。

相关内容