【问题标题】:Inserting lines in a multiline command using a for loop in a bash script在 bash 脚本中使用 for 循环在多行命令中插入行
【发布时间】:2020-06-20 01:42:59
【问题描述】:

我有一个 bash 脚本,它多次执行多行命令,并且我在每次迭代中更改一些值。下面是我的代码:

for (( peer=1; peer<=$nodesNum;peer++ ))
do  
   echo "Starting peer $peer"

nodeos -p eosio -d /eosio_data/node$peer --config-dir /eosio_data/node$peer --http-server-address=127.0.0.1:$http  \
--p2p-listen-endpoint=127.0.0.1:$p2p --access-control-allow-origin=* \
-p "user$peer" --http-validate-host=false --signature-provider=EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3  \
 --max-transaction-time=1000 --genesis-json /eosio_data/genesis.json --wasm-runtime=wabt --max-clients=2000 -e  \
--plugin eosio::chain_plugin --plugin eosio::producer_plugin --plugin eosio::producer_api_plugin  \
 --plugin eosio::chain_api_plugin \
--p2p-peer-address localhost:8888 \
 &>eosio_data/logs/nodeos_stderr$p2p.log &   \
sleep 1
http=$((http+1))
p2p=$((p2p+1))
done

作为多行命令的一部分,我需要为每个对等方多次添加 --p2p-peer-address localhost:$((9010 + $peer)) 命令。我是 bash 脚本的新手,但找不到类似的示例。

【问题讨论】:

  • 明确地说,是否有一个调用nodeos需要多个--p2p-peer-address选项?
  • 或者是nodesNum单独调用nodeos,每个都需要多个--p2p-peer-address选项? (除了 8888 选项之外还有 90xx 选项吗?)

标签: linux bash ubuntu scripting multiline


【解决方案1】:

您需要什么并不完全清楚,但我认为它类似于以下内容。一组--p2p-peer-address 选项被创建,然后合并 进入更大的常用选项集。除了常用选项之外,每次对 nodeos 的调用都有一些特定于对等点的选项。

# for example
HTTP_BASE=8080
P2P_BASE=12345

# Set of --p2p-peer-address options for shared by all calls.
for ((peer=1; peer <= $nodesNum; peer++)); do 
    peer_args+=( 
      --p2p-peer-address
      localhost:$((9010+$peer)) 
    )
done

# These are the same for all calls
fixed_args=(
    -p eosio
    "--access-control-allow-origin=*"
    --http-validate-host=false
    --signature-provider=EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
    --max-transaction-time=1000
    --genesis-json /eosio_data/genesis.json
    --wasm-runtime=wabt
    --max-clients=2000
    -e
    --plugin eosio::chain_plugin
    --plugin eosio::producer_plugin
    --plugin eosio::producer_api_plugin
    --plugin eosio::chain_api_plugin
    --p2p-peer-address localhost:8888
    "${peer_args[@]}"
)

for ((peer=1; peer<=$nodesNum; peer++)); do
    # Call-specific arguments, followed by common arguments.
    # $peer is either incorporated into each argument value
    nodeos -d /eosio_data/node$peer \
           --config-dir /eosio_data/node$peer \
           --http-server-address=127.0.0.1:$((HTTP_BASE + $peer)) \
           --p2p-listen-endpoint=127.0.0.1:$((P2P_BASE + $peer)) \
           -p "user$peer" \
           "${fixed_args[@]}" \
           &> eosio_data/logs/nodeos_stderr$((P2P_BASE + $peer)).log & 
    sleep 1
done

为避免nodeos 的每个实例尝试连接到自身,请在循环的每次迭代中重新构建peer_args。从fixed_args的定义中去掉"${peer_args[@]}",然后像这样调整主循环:

for ((peer=1; peer <= $nodesNum; peer++)); do
    peer_args=()
    for ((neighbor=1; neighbor <= $nodesNum; neighbor++)); do
        (( neighbor == peer )) && continue
        peer_args+=( --p2p-peer-address localhost:$((9010+peer)) )
    done

    nodeos -d /eosio_data/node$peer \
           --config-dir /eosio_data/node$peer \
           --http-server-address=127.0.0.1:$((HTTP_BASE + $peer)) \
           --p2p-listen-endpoint=127.0.0.1:$((P2P_BASE + $peer)) \
           -p "user$peer" \
           "${fixed_args[@]}" \
           "${peer_args[@]}" \
           &> eosio_data/logs/nodeos_stderr$((P2P_BASE + $peer)).log & 
     sleep 1
done

【讨论】:

  • 感谢您的回答,这正是我想要的。但是,出现了一个小问题 - 因为目前我正在将所有地址添加到 peer_args 数组中,这包括当前节点的 p2p 地址。这反过来每 30 秒调用一次连接监视器,因为节点无法连接到自身。是否可以动态更改 peer_args,不包括那个?
  • 可能最简单的做法是在每次调用 nodeos 之前从头开始构建 peer_args。我会更新答案。
【解决方案2】:

我认为你非常接近。您编写的表达式 --p2p-peer-address localhost:$((9010 + $peer)) 可以插入到您的 nodeos 调用中,如下所示:

for (( peer=1; peer<=$nodesNum;peer++ ))
do  
   echo "Starting peer $peer"

  nodeos -p eosio -d /eosio_data/node$peer \
   --config-dir /eosio_data/node$peer \
   --http-server-address=127.0.0.1:$http  \
   --p2p-listen-endpoint=127.0.0.1:$p2p \
   --access-control-allow-origin=* \
   -p "user$peer" \
   --http-validate-host=false \
   --signature-provider=EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3  \
   --max-transaction-time=1000 --genesis-json /eosio_data/genesis.json --wasm-runtime=wabt --max-clients=2000 -e  \
   --plugin eosio::chain_plugin --plugin eosio::producer_plugin --plugin eosio::producer_api_plugin  \
   --plugin eosio::chain_api_plugin \
   --p2p-peer-address localhost:$((9010 + $peer)) &>eosio_data/logs/nodeos_stderr$p2p.log & 

  sleep 1
  http=$((http+1))
  p2p=$((p2p+1))
done

【讨论】:

  • 对不起,我相信我没有解释得很清楚。我的问题是我必须在每次迭代中多次添加 --p2p-peer-address 行(即,每个节点都具有所有其他节点的 p2p 地址)。这只会将当前对等方的地址添加到命令中。
  • 嗨,Aleksi,我确定我错过了一些东西,因为我提出的解决方案非常明显 - 但有时前进的最佳方式是犯错并得到纠正。我很高兴你从 chepner 那里得到了你需要的帮助。
猜你喜欢
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 2020-09-04
  • 2018-05-13
相关资源
最近更新 更多