Printf在Bash中使用空格分割字符串。
Printf在Bash中使用空格分割字符串。
我在bash中的printf
函数上遇到了一些问题。\n我写了一个小脚本,在其中我传递了一个名称和两个字母(比如\"sh\",\"py\",\"ht\"),它会在当前工作目录中创建一个名为“name.extension”的文件。\n例如,如果我执行seed test py
,则会在当前工作目录中创建一个名为test.py
的文件,并且该文件的shebang是#!/usr/bin/python3
。\n到目前为止,一切都很好,没有什么特别的:我正在学习shell脚本编程,我认为这可能是一个简单的练习来测试到目前为止所掌握的知识。\n问题是当我想创建一个HTML文件时。这是我使用的函数:\n
creaHtml(){ head='\n\n\t\n\t\t\n\t\n\t\n\t\n' percorso=$CARTELLA_CORRENTE/$NOME_FILE.html printf $head>>$percorso chmod 755 $percorso }
\n例如,如果我运行seed test ht
,则会调用正确的函数(creaHtml
),创建test.html
,但是如果我尝试查看它,我只会看到:\n
\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 + set +x
\n然而,如果我尝试从终端运行printf \'\\n\\n\\t\\n\\t\\t\\n\\t\\n\\t\\n\\t\\n\'
,我能看到正确的输出:一个漂亮地显示了缩进和其他所有内容的HTML文件的\"骨架\"。我在这里漏掉了什么?
问题的原因是使用了错误的命令。使用printf
命令时,如果没有对$head
使用引号进行保护,Bash会将字符串分割以形成命令。第一个单词(第一个空格之前)被用作格式字符串,其余部分则被视为未指定要打印的参数。解决方法是使用echo -e
命令替换printf
命令。-e
选项将\n
转换为换行符,并将>>
重定向运算符替换为>
,以确保生成的文件是一个新文件而不是追加到现有文件中。
在Bash中,引号的使用需要小心。一个东西可能会变成多个东西。虽然这使得Bash更强大,但对于初学者来说可能会感到困惑。需要注意的是,我还将文件名"$percorso"
放在双引号中,以确保它作为一个整体作为变量进行评估。如果使用单引号,则文件名将被视为一个词,而不进行评估。与Python不同,使用单引号和双引号之间有很大的区别。
如果想要保持与其他系统的兼容性,可以继续使用printf
命令,但需要确保对其进行引用。
解决方法已经被验证并且可以正常工作。使用printf
命令比使用echo -e
命令更推荐,因为前者的行为在不同的shell中差异很大,而后者的行为在POSIX标准中有明确定义。
另外需要注意的是,由于printf
命令的第一个参数总是用于处理格式字符串,所以应该避免使用其内容未知的参数展开。为了安全起见,应该使用printf '%s' "$head"
。
关于$head
中包含\t
和\n
的问题,这是由于creaHTML
函数内部没有正确嵌入制表符和换行符的原因。应该在值中使用实际的制表符和换行符字符,而不是需要特殊处理的双字符表示形式。
本文介绍了一个问题的出现原因以及解决方法。问题是由于使用了错误的命令(printf
)导致的,解决方法是使用正确的命令(echo -e
)。文章还提到了在Bash中使用引号的注意事项以及printf
命令和echo -e
命令的区别。最后,文章还提到了关于参数展开和特殊字符处理的问题,并给出了相应的解决办法。