如何在bash中将实际变量传递给文本文件?
问题的原因是在Bash中使用双引号时,变量会被解析并替换为其值,而单引号不会对变量进行解析。因此,在将变量传递给文本文件时,应该使用单引号而不是双引号。
解决方法是将代码中的双引号替换为单引号。在给出的代码示例中,将以下部分替换为单引号:
"Backup $(date +%s)"
替换为:
'Backup $(date +%s)'
这样可以确保脚本中的变量不会被解析,而是作为字符串直接传递给文本文件。
关于">>",它是一个追加操作符,用于将输出附加到文件末尾。如果不希望追加到文件末尾,可以使用">"操作符,它会覆盖文件中的内容。
需要注意的是,如果单引号中的字符串本身包含单引号,那么需要对单引号进行转义。这可以通过在需要转义的单引号前面添加反斜杠来实现。然而,在给出的代码示例中,并不需要对单引号进行转义。
在Bash中,为了将变量作为字符串传递给文本文件,应该使用单引号而不是双引号。此外,如果希望将输出附加到文件末尾,可以使用">>>"操作符。如果字符串中包含单引号,则需要对其进行转义。
问题出现的原因是需要将变量传递给一个文本文件,在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
命令的命令替换进行了转义,以防止展开。由于对问题是只想要一个还是两个不清楚,所以我给出了两个例子。