在 bash 脚本中使用 for 循环在多行命令中插入行

Inserting lines in a multiline command using a for loop in a bash script

我有一个 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 脚本的新手,找不到类似的示例。

不是很清楚你需要什么,但我想应该是下面这样的。创建并合并了 --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

我觉得你们很亲密。您编写的表达式 --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