将变量传递给 vagrant 中的 shell 脚本配置器

Posted

技术标签:

【中文标题】将变量传递给 vagrant 中的 shell 脚本配置器【英文标题】:Passing variable to a shell script provisioner in vagrant 【发布时间】:2013-03-05 21:48:08 【问题描述】:

我正在使用一个简单的 shell 脚本来为 vagrant 设置提供软件,如 here 所示。

但无法找到一种方法来获取传递给 vagrant 的命令行参数并将它们发送到外部 shell 脚本。 Google 透露这是作为一项功能添加的,但我找不到任何涵盖它的文档或示例。

【问题讨论】:

【参考方案1】:

你是对的。传递参数的方式是使用:args 参数。

config.vm.provision :shell, :path => "bootstrap.sh", :args => "'first arg' second"

请注意,只有当您想在传递的参数中包含空格时,才需要在 first arg 周围加上单引号。也就是上面的代码相当于在终端输入以下内容:

$ bootstrap.sh 'first arg' second

脚本中的 $1 指的是字符串“first arg”,而 $2 指的是字符串“second”。

可以在此处找到关于此的 v2 文档:http://docs.vagrantup.com/v2/provisioning/shell.html

【讨论】:

当 arg 是 vagrantfile 中的变量时,我认为这不起作用。例如:- args: "#MY_VARIABLE" 并在您的 .sh 脚本中:- echo $1 有没有办法传递像vagrant provision --arg1 --arg2 这样的参数?然后访问我们的配置脚本中的那些。我几乎 99% 确定答案是否定的,但仍然无法阻止自己问。【参考方案2】:

确实,它不适用于变量! 正确的语法是:

var1= "192.168.50.4"
var2 = "my_server"
config.vm.provision :shell, :path => 'setup.sh', :args => [var1, var2]

然后,在 shell setup.sh 中:

echo "### $1 - $2"

> ### 192.168.50.4 - my_server

【讨论】:

【参考方案3】:

这是从环境中传递变量的另一种方法:

config.vm.provision "shell" do |s|
    s.binary = true # Replace Windows line endings with Unix line endings.
    s.inline = %Q(/usr/bin/env    \
      TRACE=#ENV['TRACE']       \
      VERBOSE=#ENV['VERBOSE']   \
      FORCE=#ENV['FORCE']       \
      bash my_script.sh)
end

示例用法:

TRACE=1 VERBOSE=1 vagrant up

【讨论】:

【参考方案4】:

为了添加显式参数,我成功地使用了这个:

config.vm.provision "shell", path: "provision.sh", :args => "--arg1 somearg --arg2 anotherarg"

【讨论】:

【参考方案5】:

根据我在旧版docs page 中找到的一些信息回答我自己的问题:

config.vm.provision :shell, :path => "bootstrap.sh", :args => "'abc'"

-- @user1391445

【讨论】:

【参考方案6】:

在新版本中可以使用数组:

config.vm.provision :shell, :path => "bootstrap.sh", :args:["first", "second"]

【讨论】:

以上是关于将变量传递给 vagrant 中的 shell 脚本配置器的主要内容,如果未能解决你的问题,请参考以下文章

shell特殊变量

如何将awk中一个变量的值传递给shell中的变量

如何将 shell 脚本中的结果传递给 Job 中的变量

是否可以将脚本传递给shell变量中的awk?

将 $@ 传递给 shell 脚本中的函数

将 shell 转义的参数字符串传递给 Bourne shell 中的子命令