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

Printf使用Bash在空格处拆分字符串,bash,printf,Bash,Printf,我在bash中的printf函数中遇到了一些问题。 我写了一个小脚本,在上面我传递了一个名字和两个字母(比如“sh”、“py”、“ht”),它在当前工作目录中创建了一个名为“name.extension”的文件。 例如,如果我执行seed test py一个名为test.py的文件,它将使用shebang#在当前工作目录中创建/usr/bin/python3 到目前为止,一切都很好,没有什么特别之处:我正在学习shell脚本,我认为这可能是一个简单的练习来测试迄今为止所获得的知识。 问题是当我想

我在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

}
没有别的了。 这是该函数的跟踪:

[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
[sviluppo:~/bin]$seed test ht
+克雷赫特尔
+head='\n\n\t\n\t\t\n\t\n\t\n\t\n'
+percorso=/home/sviluppo/bin/test.html
+printf'\n\n\t\n\t\t\n\t\n\t\n\t\n'
+chmod 755/home/sviluppo/bin/test.html
+集合+x

但是,如果我尝试从终端运行
printf'\n\n\t\n\t\t\n\t\n\t\n'
,我会看到正确的输出:HTML文件的“骨架”整齐地显示缩进和所有内容。我缺少什么?

尝试
echo-e
而不是
printf
printf
用于打印格式化字符串。由于没有使用引号保护
$head
,bash将字符串拆分为命令。第一个单词(在第一个空格之前)构成格式字符串。其余的只是您没有指定要打印的内容的参数

echo -e "$head" > "$percorso"
-e
\n
计算成新行。我将您的
>
更改为
,因为看起来您希望这是整个文件,而不是附加到任何现有文件中

在bash中使用引号时必须小心。一件事可以变成许多事。这实际上使它更强大,但它可能会让学习的人感到困惑。注意,我还将文件名“$percorso”也放在双引号中。这将评估变量,并确保它作为一件事结束。如果使用单引号,它将是一个单词,但不会计算。与Python不同,单引号和双引号之间有很大区别

如果您想像@chepner指出的那样使用
printf
实现兼容性,请务必引用它:

printf "$head" > "$percorso"

实际上,这要简单得多。

基本上,引用您的变量。不要使用echo-e,因为它是非标准的
printf
将在添加引号时执行您想要的操作。为了完全确定,我在引用变量时必须使用双引号,例如
printf“$var1”
,对吗?双引号将计算内部变量。单引号用于不计算的文本。好的,我想我明白了。我也在学习Python,所以这个“双引号/单引号”的东西有点让人困惑!它就像一个符咒。谢谢你的闪电回答,我会尽快接受你的回答,stackoverflow说我可以在6分钟内接受。建议使用
printf
而不是
echo-e
,如果这只是一个好习惯的话
echo
的行为在不同的shell之间差异很大,而
printf
的行为由POSIX定义得很好。@chepner很好。我补充说。这样做也更简单。我一开始就应该这样做。还有一点。由于总是为格式字符串处理
printf
的第一个参数,因此应避免使用内容未知的参数扩展。(例如,考虑
printf“%s”
)使用
printf“%s'$head”
以确保安全。这是
creaHTML的问题;它应该在值中嵌入实际的制表符和换行符,而不是需要专门处理的有向图。
printf "$head" > "$percorso"