シェルスクリプトにコマンド変数を導入しても機能しません。

シェルスクリプトにコマンド変数を導入しても機能しません。

これは予想通り正確に機能します。

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

変数が一重引用符で囲まれているため、機能しません。シェルは一重引用符で変数を拡張しません。 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"

2番目の「bash」には$ 0が割り当てられます。

関連情報