我正在编写一个 bash 脚本,它将生成一个 Vagrantfile。我使用bash脚本生成Vagrantfile的原因是为了让我的同事能够在运行之前使用单个脚本来设置他们的环境vagrant up
我现在面临的挑战是当将命令行附加到Vagrantfile时,命令被执行而不是附加进入 Vagrantfile
例如 (setup-vagrant-host.sh
)
#!/bin/bash
.
.
.
some pre requisites steps
.
.
.
# Generate Vagrantfile
cat <<EOL > Vagrantfile
Vagrant.configure("2") do |config|
config.vm.define "vagrant-host"
config.vm.provision "shell", inline: <<-SHELL
sudo su
apt update
ipaddress=`hostname -I | awk '{print $2}'`
echo "*** IP address is $ipaddress ***"
SHELL
end
EOL
vagrant up
当我执行上面的脚本时,hostname -I | awk '{print $2}'
总是执行而不是附加到 Vagrantfile,我不知道我这样做是否正确,请建议一个更好的方法...
不是以英语为母语的人,忘记我糟糕的语法,谢谢
答案1
此处文档中的扩展由 shell 执行,除非扩展本身被引用,或者此处文档本身被引用。
引用命令替换以及 shell 将尝试在示例中的此处文档中扩展的各种其他变量:
cat <<EOL > Vagrantfile
Vagrant.configure("2") do |config|
config.vm.define "vagrant-host"
config.vm.provision "shell", inline: <<-SHELL
sudo su
apt update
ipaddress=\\\$(hostname -I | awk '{print \\\$2}')
echo "*** IP address is \\\$ipaddress ***"
SHELL
end
EOL
请注意,我们不仅必须$
在命令替换中引用 in,还必须在代码$2
中awk
和调用$ipaddress
中引用 in echo
。我们实际上需要使用双引号这些字符串,\\\
因为它们实际上是嵌入的此处文档 ( ) 的一部分SHELL
。每个都\\\$
将被替换为“\$
何时Vagrantfile
写入”。
除非你真的想shell 来扩展此处文档中的某些变量,通常更容易将此处文档作为一个整体引用。这是通过引用初始的此处文档分隔符字符串来完成的:
cat <<'EOL' > Vagrantfile
Vagrant.configure("2") do |config|
config.vm.define "vagrant-host"
config.vm.provision "shell", inline: <<-'SHELL'
sudo su
apt update
ipaddress=`hostname -I | awk '{print $2}'`
echo "*** IP address is $ipaddress ***"
SHELL
end
EOL
在这里,我选择引用嵌入的此处文档和外部此处文档。
根据此代码的使用方式和位置,您可能需要确保第一个和嵌入的此处文档均使用制表符缩进,并且两个此处文档均以<<-
(<<-'EOL'
和<<-'START'
) 开头。这将确保嵌入的此处文档可以被正确解析(一旦创建,结尾SHELL
需要排在第一个)。Vagrantfile
请注意,我没有对此发表评论内容就此处文档试图实现的目标而言。例如,我不知道是否sudo su
有意义。
答案2
您必须使用反斜杠转义定界文档中的反引号:
ipaddress=\`hostname -I | awk '{print $2}'\`