2017-10-15 89 views
0

我在將參數與空白從一個bash腳本傳遞到另一個bash腳本時會出現問題,這個腳本將通過ssh遠程運行。我有一個劇本,create-node.sh看起來像這樣:如果我使用ssh遠程執行其中一個腳本,如何在從一個腳本向另一個腳本傳遞參數時保留空格?

# create-node.sh 
#!/bin/bash 

function set_node_env_variables {   
    docker-machine ssh remote-machine 'bash -s' < ./set-env-variables.sh \ 
     $ENV_VARIABLE_ONE \ # "foo bar" 
     $ENV_VARIABLE_TWO \ # feefi 
     $ENV_VARIABLE_THREE \ # "fo fum" 
     $ENV_VARIABLE_FOUR # huffpuff   
} 

create-node.sh將參數傳遞給set-env-variables.sh,這是遠程運行使用ssh,看起來像這樣:

# set-env-variables.sh 
#!/bin/bash 

i=0 
argv=() 

for arg in "[email protected]"; do 
    argv[$i]="$arg" 
    i=$((i + 1)) 
done 

echo "export ENV_VARIABLE_ONE=${argv[0]}" >> /root/.profile #expected: "foo bar"; actual: foo 
echo "export ENV_VARIABLE_TWO=${argv[1]}" >> /root/.profile #expected: feefi; actual: bar 
echo "export ENV_VARIABLE_THREE=${argv[2]}" >> /root/.profile #expected: "fo fum"; actual: feefi 
echo "export ENV_VARIABLE_FOUR=${argv[3]}" >> /root/.profile #expected: huffpuff; actual: fo 

帶空格或特殊字符的環境變量在機器上用雙引號存儲,它將使用ssh執行set-env-variables.sh,否則我根本不使用引號。

如何在將參數從create-node.sh傳遞給set-env-variables.sh時如何在使用ssh遠程執行set-env-variables.sh時保留空格?

+1

「......我根本不使用引號」。這是一個錯誤。你需要(至少)用dbl-quotes包圍所有變量名('$ VAR1'),即。 '「$ VAR1」'。祝你好運。 – shellter

+0

不幸的是,我通過帶引號的參數傳遞的變量名仍然不能保留空白。 –

+1

在空格之前轉義字符「\」? – L30n1d45

回答

1

首先,我們重寫set-env-variable來簡化它。 (真的,它沒有設置任何東西;它只是生成一個可以設置環境變量的腳本,但我們會忽略它。)您不需要創建argv;你可以直接使用位置參數。

#!/bin/bash 

{ 
    printf 'export ENV_VARIABLE_ONE="%q"\n' "$1" 
    printf 'export ENV_VARIABLE_TWO="%q"\n' "$2" 
    printf 'export ENV_VARIABLE_THREE="%q"\n' "$3" 
    printf 'export ENV_VARIABLE_FOUR="%q"\n' "$4" 
} >> /root/.profile 

(使用%q,以確保該變量的值是引用正確地在命令中使用。例如,包含雙引號的值需要有逃跑了,這樣它不會誤關閉在export命令的雙引號:export foo="hi\"there"export foo="hi"there"

接下來,請務必正確引用您的擴展的功能(和,也沒有必要從標準輸入讀取腳本;你只需要把它作爲第一個。參數爲bash):

set_node_env_variables() {   
    docker-machine ssh remote-machine \ 
     bash ./set-env-variables.sh \ 
      "$ENV_VARIABLE_ONE" \ 
      "$ENV_VARIABLE_TWO" \ 
      "$ENV_VARIABLE_THREE" \ 
      "$ENV_VARIABLE_FOUR"   
} 
相關問題