【问题标题】:How do I preserve whitespace when passing parameters from one script to another, if I'm executing one of those scripts remotely using ssh?如果我使用 ssh 远程执行其中一个脚本,在将参数从一个脚本传递到另一个脚本时如何保留空格?
【发布时间】:2017-10-15 13:04:36
【问题描述】:

我在将带有空格的参数从一个 bash 脚本传递到另一个将使用 ssh 远程运行的 bash 脚本时遇到问题。我有一个脚本,create-node.sh,它看起来像这样:

# 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 "$@"; 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 的机器上,否则我根本不使用引号。

如果我使用 ssh 远程执行 set-env-variables.sh,在将参数从 create-node.sh 传递到 set-env-variables.sh 时如何保留空格?

【问题讨论】:

  • "...我根本没有使用引号" 。那是一个错误。您需要(至少)用 dbl-quotes 包围所有变量名($VAR1),即。 "$VAR1" 。祝你好运。
  • 不幸的是,将我作为参数传递的变量名称用引号括起来仍然没有保留空格。
  • 空格前转义字符“\”?

标签: linux bash shell ssh quoting


【解决方案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"        
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多