Bash

將變數傳遞給 shell 文件中的字元串

  • May 14, 2018

我出於某種原因無法弄清楚這一點。我需要以下內容看起來像這樣。我基本上不想寫相同的命令 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

引用自:https://unix.stackexchange.com/questions/443756