Printf在Bash中使用空格分割字符串。

14 浏览
0 Comments

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文件的\"骨架\"。我在这里漏掉了什么?

0
0 Comments

问题的原因是使用了错误的命令。使用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命令的区别。最后,文章还提到了关于参数展开和特殊字符处理的问题,并给出了相应的解决办法。

0