【发布时间】:2016-05-18 03:27:56
【问题描述】:
我在使用 bash 中的 printf 函数时遇到了一些问题。
我编写了一个小脚本,在上面传递了一个名称和两个字母(例如“sh”、“py”、“ht”),它在当前工作目录中创建了一个名为“name.extension”的文件。
例如,如果我执行seed test py,则会在当前工作目录中创建一个名为test.py 的文件,并使用shebang #!/usr/bin/python3。
到目前为止,一切都很好,没什么特别的:我正在学习 shell 脚本,我认为这可能是一个简单的练习,可以测试到目前为止所获得的知识。 问题是当我想创建一个 HTML 文件时。这是我使用的功能:
creaHtml(){
head='<!--DOCTYPE html-->\n<html>\n\t<head>\n\t\t<meta charset=\"UTF-8\">\n\t</head>\n\t<body>\n\t</body>\n</html>'
percorso=$CARTELLA_CORRENTE/$NOME_FILE.html
printf $head>>$percorso
chmod 755 $percorso
}
如果我运行,例如,seed test ht 调用了正确的函数 (creaHtml),则会创建 test.html,但如果我尝试查看它,我只会看到:
<!--DOCTYPE
没有别的了。 这是该函数的跟踪:
[sviluppo:~/bin]$ seed test ht
+ creaHtml
+ head='<!--DOCTYPE html-->\n<html>\n\t<head>\n\t\t<meta charset=\"UTF-8\">\n\t</head>\n\t<body>\n\t</body>\n</html>'
+ percorso=/home/sviluppo/bin/test.html
+ printf '<!--DOCTYPE' 'html-->\n<html>\n\t<head>\n\t\t<meta' 'charset=\"UTF-8\">\n\t</head>\n\t<body>\n\t</body>\n</html>'
+ chmod 755 /home/sviluppo/bin/test.html
+ set +x
但是,如果我尝试从终端运行printf '<!--DOCTYPE html-->\n<html>\n\t<head>\n\t\t<meta charset=\"UTF-8\">\n\t</head>\n\t<body>\n\t</body>\n</html>',我会看到正确的输出:HTML 文件的“骨架”整齐地显示,并带有缩进和所有内容。我在这里错过了什么?
【问题讨论】:
-
基本上,引用你的变量。不要使用
echo -e,因为它是非标准的。printf将在您添加引号时执行您想要的操作。 -
为了完全确定,当我引用变量时,我必须双引号,例如
printf "$var1",对吧? -
双引号将评估里面的变量。单引号用于不会被评估的文字。
-
好的,我想我明白了。我也在学习 Python,所以这整个“双引号/单引号”的东西有点混乱