在bash中使用变量

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (9)

我试图在bash中插入变量:

var=$1
sudo tee "/path/to/outfile" > /dev/null << "EOF"
Some text that contains my $var
EOF

这不像我所期望的那样起作用($var是按字面处理的,而不是扩展的)。

我需要使用sudoty,因为创建文件需要sudo。做以下事情:

sudo cat > /path/to/outfile <<EOT
my text...
EOT

不工作,因为>>outfile打开当前shell中的文件,该文件不使用sudo。

提问于
用户回答回答于

在回答第一个问题时,没有参数替换,因为在引号中放置了分隔符:

这里文件的格式是: <<-Word-文档分隔符 不执行参数展开、命令替换、算术展开或路径名展开。。如果任何字符在被引用,划界器是删除Word引号的结果,此处文档中的行没有展开。如果如果未引用,则此处文档的所有行都会受到参数展开、命令替换和算术扩展的影响。

如果将第一个示例更改为使用<<EOF而不是<< "EOF"你会发现它有效。

在第二个示例中,shell调用sudo只使用参数cat,而重定向适用于sudo cat作为原始用户。如果你尝试:

sudo sh -c "cat > /path/to/outfile" <<EOT
my text...
EOT
用户回答回答于

不要用引号<<EOF:

var=$1
sudo tee "/path/to/outfile" > /dev/null <<EOF
Some text that contains my $var
EOF

变量展开是这里-docs内部的默认行为。通过引用标签(单引号或双引号)禁用该行为。

扫码关注云+社区