我在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文件整齐地显示缩进和一切。我在这里缺少什么?
答案 0 :(得分:1)
尝试使用echo -e
代替printf
。 printf
用于打印格式化字符串。由于您没有使用引号保护$head
,因此bash会拆分字符串以形成命令。第一个单词(在第一个空格之前)形成格式字符串。其余的只是你没有指定打印的事情的论据。
echo -e "$head" > "$percorso"
-e
会将您的\n
评估为换行符。我将您的>>
更改为>
,因为看起来您希望将其作为整个文件,而不是附加到您可能拥有的任何现有文件。
你必须小心bash中的引号。有一件事可以变成很多东西。这实际上使它更强大,但它可能让人们学习困惑。请注意,我也将文件名"$percorso"
放在双引号中。这会对变量进行评估,并确保它最终成为一件事。如果您使用单引号,它将是一个单词,但不会被评估。与Python不同,单引号和双引号之间存在很大差异。
如果你想使用printf
来兼容@chepner指出的,请务必引用它:
printf "$head" > "$percorso"
实际上,这无论如何都要简单得多。