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