Bash
將變數傳遞給 shell 文件中的字元串
我出於某種原因無法弄清楚這一點。我需要以下內容看起來像這樣。我基本上不想寫相同的命令 20-50 次,取決於甚至更多。謝謝!
下面目前循環的問題是命令中字元串內的 vars ${NETWORKNAME,,} 返回一個空字元串。例子
docker exec cli.Amazon bash -c 'peer channel create -c asus -f ./channels/Asus.tx -o orderer..com:7050'
這顯然不是一個正確的命令
我在尋找什麼
docker exec cli.Amazon bash -c 'peer channel create -c asus -f ./channels/Asus.tx -o orderer.pcexchange.com:7050'
目前程式碼
#!/bin/bash NETWORKNAME=PCEXCHANGE VERSION=1.1.0 ORGANIZATIONS=( "Asus" "Dell" "HP" "Amazon" ) PRODUCERS=( "Asus" "Dell" "HP" ) MAKERS=( "Amazon" ) for org in ${PRODUCERS[@]} do for maker in ${MAKERS[@]} do docker exec cli.${maker} bash -c 'peer channel create -c ${org,,} -f ./channels/${org}.tx -o orderer.${NETWORKNAME,,}.com:7050' done done
您需要使用雙引號而不是單引號 - 單引號可防止發生變數擴展。試試這個:
#!/bin/bash NETWORKNAME=PCEXCHANGE VERSION=1.1.0 ORGANIZATIONS=( "Asus" "Dell" "HP" "Amazon" ) PRODUCERS=( "Asus" "Dell" "HP" ) MAKERS=( "Amazon" ) for org in ${PRODUCERS[@]} do for maker in ${MAKERS[@]} do docker exec cli.${maker} bash -c "peer channel create -c ${org,,} -f ./channels/${org}.tx -o orderer.${NETWORKNAME,,}.com:7050" done done
為了安全地將變數傳遞到
bash -c
子 shell,您可以使用bash -c 'script goes here' bash "arg1" "arg2" "arg3" ...
那是,
#!/bin/bash NETWORKNAME=PCEXCHANGE VERSION=1.1.0 ORGANIZATIONS=( "Asus" "Dell" "HP" "Amazon" ) PRODUCERS=( "Asus" "Dell" "HP" ) MAKERS=( "Amazon" ) for org in "${PRODUCERS[@]}"; do for maker in "${MAKERS[@]}"; do docker exec "cli.$maker" \ bash -c 'peer channel create -c "$1" -f "$2" -o "$3"' bash \ "${org,,}" "./channels/$org.tx" "orderer.${NETWORKNAME,,}.com:7050" done done
這將允許子 shell 腳本工作,即使任何生產者的值中有空格。
還要注意腳本中其他擴展的引用,即使生產者或製作者的值中有空格,它也可以工作。
腳本本身
bash
文本後面的參數是傳遞給. 這通常是腳本或解釋器的名稱,所以我們只需傳遞字元串。bash -c``$0``bash