You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Shell脚本中传递变量调用Hyperledger Fabric链码函数

问题原因

  1. 第一版脚本的问题:Shell 中单引号包裹的内容不会做变量插值,$arg1 等变量会原样传递给链码,无法替换为实际传入的参数值。
  2. 第二版脚本的问题:手动拼接的单引号会被作为 JSON 内容的一部分传递给 peer 命令,导致 JSON 解析器遇到非法的单引号开头报错。

解决方案

简单修改版(直接修正传参逻辑)

不需要额外拼接单引号,只需要把构造好的 JSON 字符串用双引号包裹作为 -c 的参数即可,修改后完整脚本如下:

#!/bin/bash

invokeCC() {
   arg1=$1
   arg2=$2
   arg3=$3
   arg4=$4
   arg5=$5

   export PATH=${PWD}/../bin:$PATH
   export FABRIC_CFG_PATH=$PWD/../config/
   export CORE_PEER_TLS_ENABLED=true
   export CORE_PEER_LOCALMSPID="Org1MSP"
   export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
   export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
   export CORE_PEER_ADDRESS=localhost:7051

   # 直接构造JSON串,双引号包裹保证变量正常插值
   args="{\"function\":\"StorePacketData\",\"Args\":[\"$arg1\", \"$arg2\", \"$arg3\", \"$arg4\", \"$arg5\"]}"

   peer chaincode invoke -o localhost:7050 \
   --ordererTLSHostnameOverride orderer.example.com \
   --tls \
   --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \
   -C mychannel -n basic \
   --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \
   --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
   # 直接将JSON串用双引号包裹作为参数,不需要额外加单引号
   -c "$args"
}

invokeCC "$1" "$2" "$3" "$4" "$5"

注意调用函数时参数也要用双引号包裹,避免传入的参数带空格时被错误拆分。

健壮版(用jq生成JSON,避免特殊字符问题)

如果传入的参数可能包含双引号、空格等特殊字符,手动拼接JSON容易出现格式错误,推荐用jq工具生成合法JSON:

#!/bin/bash

invokeCC() {
   arg1=$1
   arg2=$2
   arg3=$3
   arg4=$4
   arg5=$5

   export PATH=${PWD}/../bin:$PATH
   export FABRIC_CFG_PATH=$PWD/../config/
   export CORE_PEER_TLS_ENABLED=true
   export CORE_PEER_LOCALMSPID="Org1MSP"
   export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
   export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
   export CORE_PEER_ADDRESS=localhost:7051

   # 用jq生成合法JSON,自动处理特殊字符转义
   args=$(jq -n \
   --arg a1 "$arg1" \
   --arg a2 "$arg2" \
   --arg a3 "$arg3" \
   --arg a4 "$arg4" \
   --arg a5 "$arg5" \
   '{"function":"StorePacketData","Args":[$a1,$a2,$a3,$a4,$a5]}')

   peer chaincode invoke -o localhost:7050 \
   --ordererTLSHostnameOverride orderer.example.com \
   --tls \
   --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \
   -C mychannel -n basic \
   --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \
   --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \
   -c "$args"
}

invokeCC "$1" "$2" "$3" "$4" "$5"

内容的提问来源于stack exchange,提问作者Shailesh Mishra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:09:03