【发布时间】:2014-01-27 10:33:34
【问题描述】:
我目前正在编写一个读取 Vagrantfile 并引导它的 shell 脚本(简而言之;))
但是我用下面的代码碰壁了:
TEST=()
while read result; do
TEST+=(`echo ${result}`)
done <<< `awk '/config.vm.define[ \s]\"[a-z]*\"[ \s]do[ \s]\|[a-zA-Z_]*\|/, /end/ { print }' Vagrantfile`
echo "${TEST[1]}"
当我将 Vagrantfile 传递到这个 awk 模式正则表达式中时,其中定义了两台机器(config.vm.define),它们被找到了。
输出
config.vm.define "web" do |web|
web.vm.box = "CentOs"
web.vm.box_url = "http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box"
web.vm.hostname = 'dev.local'
web.vm.network :forwarded_port, guest: 90, host: 9090
web.vm.network :private_network, ip: "22.22.22.11"
web.vm.provision :puppet do |puppet|
puppet.manifests_path = "puppet/manifests"
puppet.manifest_file = "web.pp"
puppet.module_path = "puppet/modules"
puppet.options = ["--verbose", "--hiera_config /vagrant/hiera.yaml", "--parser future"]
end
config.vm.define "db" do |db_mysql|
db_mysql.vm.box = "CentOs"
db_mysql.vm.box_url = "http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box"
db_mysql.vm.hostname = 'db.mysql.local'
db_mysql.vm.network :private_network, ip: "22.22.22.22"
db_mysql.vm.network :forwarded_port, guest: 3306, host: 3306
db_mysql.vm.provision :puppet do |puppet|
puppet.manifests_path = "puppet/manifests"
puppet.manifest_file = "db.pp"
puppet.module_path = "puppet/modules"
puppet.options = ["--verbose", "--hiera_config /vagrant/hiera.yaml", "--parser future"]
end
但我似乎无法很好地将它们传递到数组中。我想要的是 TEST 数组包含两个索引,机器 config.vm.define 块作为它们的对应值。
例如
TEST[0] = 'config.vm.define "web" do |web|
.... [REST OF THE BLOCK CONTENT] ...
end'
TEST[1] = 'config.vm.define "db" do |db_mysql|
.... [REST OF THE BLOCK CONTENT] ...
end'
输出echo "${TEST[1]}" 是nothing。 echo "${TEST[0]}" 返回如上图所示的整个块。
我玩过 IFS / RS / FS,但我似乎无法获得我想要的输出。
【问题讨论】:
-
awk命令本身的确切输出是什么?在您的示例中echo "${TEST[1]}"的结果是什么? -
每个
config.vm.define块中是否有换行符? -
@grebneke 用输出更新了问题,是的,里面有换行符
标签: arrays bash shell awk vagrant