Printf使用Bash在空格处拆分字符串

时间:2016-02-08 12:51:22

标签: bash printf

我在bash中遇到printf函数的麻烦。 我写了一个小脚本,我在其上传递了一个名字和两个字母(例如" sh"," py"," ht")并且它创建了一个文件当前工作目录名为" name.extension"。 例如,如果我执行seed test py,则在当前工作目录中使用shebang test.py创建名为#!/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>',我会看到正确的输出:&#34;骨架&#34;一个HTML文件整齐地显示缩进和一切。我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

尝试使用echo -e代替printfprintf用于打印格式化字符串。由于您没有使用引号保护$head,因此bash会拆分字符串以形成命令。第一个单词(在第一个空格之前)形成格式字符串。其余的只是你没有指定打印的事情的论据。

echo -e "$head" > "$percorso"

-e会将您的\n评估为换行符。我将您的>>更改为>,因为看起来您希望将其作为整个文件,而不是附加到您可能拥有的任何现有文件。

你必须小心bash中的引号。有一件事可以变成很多东西。这实际上使它更强大,但它可能让人们学习困惑。请注意,我也将文件名"$percorso"放在双引号中。这会对变量进行评估,并确保它最终成为一件事。如果您使用单引号,它将是一个单词,但不会被评估。与Python不同,单引号和双引号之间存在很大差异。

如果你想使用printf来兼容@chepner指出的,请务必引用它:

printf "$head" > "$percorso"

实际上,这无论如何都要简单得多。