簡體   English   中英

在 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每個實例nodeos嘗試連接到自身,請在循環的每次迭代中重新構建peer_args 刪除"${peer_args[@]}"從定義fixed_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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM