如何在Shell脚本中传递变量调用Hyperledger Fabric链码函数
问题原因
- 第一版脚本的问题:Shell 中单引号包裹的内容不会做变量插值,
$arg1等变量会原样传递给链码,无法替换为实际传入的参数值。 - 第二版脚本的问题:手动拼接的单引号会被作为 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
相关产品推荐
相关产品推荐

