28

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

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

4

6 回答 6

34

你是对的。传递参数的方法是使用: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

于 2013-05-24T20:15:58.473 回答
10

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

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
于 2016-05-08T20:00:10.883 回答
5

这是从环境中传递变量的替代方法:

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
于 2016-06-16T00:50:57.000 回答
2

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

config.vm.provision "shell", path: "provision.sh", :args => "--arg1 somearg --arg2 anotherarg"
于 2017-09-07T10:23:38.147 回答
1

根据我在旧版本的文档页面中找到的一些信息回答我自己的问题:

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

-- @user1391445

于 2016-06-16T00:47:29.213 回答
1

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

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

于 2018-09-11T09:26:22.777 回答