如何在bash中将实际变量传递给文本文件?

27 浏览
0 Comments

如何在bash中将实际变量传递给文本文件?

我正在创建一个脚本,需要根据时间戳为私有仓库的自动备份生成提交信息。

echo "#!/bin/bash   
     cd ${DIRECTORY}
     git add .
     git commit -m 'Backup $(date +%s)'
     git push origin master
" >> backup.sh

时间戳$(date +%s)变量必须按原样打印在文件中,而不是在生成此文件时打印时间戳。

在bash中,如何将实际变量传递给文本文件?

我尝试过使用反引号,但没有打印任何内容。也许我用错了吗?

0
0 Comments

问题的原因是在Bash中使用双引号时,变量会被解析并替换为其值,而单引号不会对变量进行解析。因此,在将变量传递给文本文件时,应该使用单引号而不是双引号。

解决方法是将代码中的双引号替换为单引号。在给出的代码示例中,将以下部分替换为单引号:

"Backup $(date +%s)"

替换为:

'Backup $(date +%s)'

这样可以确保脚本中的变量不会被解析,而是作为字符串直接传递给文本文件。

关于">>",它是一个追加操作符,用于将输出附加到文件末尾。如果不希望追加到文件末尾,可以使用">"操作符,它会覆盖文件中的内容。

需要注意的是,如果单引号中的字符串本身包含单引号,那么需要对单引号进行转义。这可以通过在需要转义的单引号前面添加反斜杠来实现。然而,在给出的代码示例中,并不需要对单引号进行转义。

在Bash中,为了将变量作为字符串传递给文本文件,应该使用单引号而不是双引号。此外,如果希望将输出附加到文件末尾,可以使用">>>"操作符。如果字符串中包含单引号,则需要对其进行转义。

0
0 Comments

问题出现的原因是需要将变量传递给一个文本文件,在bash中无法直接将变量传递给文本文件。解决方法是使用heredoc(文档内嵌)的方式来向backup.sh追加内容。

使用heredoc可以使用<<-来保留制表符缩进,并通过给heredoc sigil(如'EOF')加上单引号来控制变量的展开。

如果想要展开${DIRECTORY}变量但保留$(date +%s)命令的结果,可以使用以下代码:

cat << EOF >> backup.sh
#!/bin/bash   
cd ${DIRECTORY}
git add .
git commit -m 'Backup \$(date +%s)'
git push origin master
EOF

这将在backup.sh中追加正确的目录和$(date +%s)命令结果。

如果想要将${DIRECTORY}$(date +%s)都作为输入传递给backup.sh,而不进行展开,只需要给第一个'EOF'加上单引号,如下所示:

cat << 'EOF' >> backup.sh
#!/bin/bash   
cd ${DIRECTORY}
git add .
git commit -m 'Backup $(date +%s)'
git push origin master
EOF

如果希望更好地理解实际发生的情况,还可以将代码写成以下形式:

cat >> backup.sh << EOF
...
EOF

(如果你喜欢将"EOF ... EOF"之间的内容理解为放入backup.sh中)

在commit消息周围的单引号可以防止date命令的执行。

但是,在第二个例子中,它被引用了。哦,好吧,我想我们都在猜测OP实际想要的是什么。

是的,而且它们都不会展开-这是我认为问题所描述的。在未引用sigil的第一个例子中,${DIRECTORY}被保留展开,但是对于date命令的命令替换进行了转义,以防止展开。由于对问题是只想要一个还是两个不清楚,所以我给出了两个例子。

0
0 Comments

在bash中,当我们想要将一个实际的变量传递给一个文本文件时,我们可能会遇到一个问题。问题的原因是因为在bash中,$符号表示一个扩展(在这种情况下,$(..)执行date程序),所以我们需要将这个字符转义为字面意义上的$

要解决这个问题,我们可以在$前面加上一个反斜杠\,这样它就会被解释为一个字面意义上的$。具体的做法是在变量前加上\,即\$

0