bash中的Printf示例不创建换行符

bash中的Printf示例不创建换行符,bash,printf,Bash,Printf,在bash脚本中使用printf,在“\n”之后不添加空格不会创建换行符,而添加空格会创建换行符,例如: “\n” 结果: FirstlineLastline Firstline Lastline Firstline Lastline “\n” 结果: FirstlineLastline Firstline Lastline Firstline Lastline 问题:1为什么不呢。创建以下结果: Firstline Lastline 我知

在bash脚本中使用
printf
,在
“\n”
之后不添加空格不会创建换行符,而添加空格会创建换行符,例如:

  • “\n”

    结果:

    FirstlineLastline
    
    Firstline
     Lastline
    
        Firstline
        Lastline
    
  • “\n”

    结果:

    FirstlineLastline
    
    Firstline
     Lastline
    
        Firstline
        Lastline
    
  • 问题:1为什么不呢。创建以下结果:

    Firstline 
    Lastline
    
    我知道这个特定的问题可以通过使用其他技术来解决,但我想重点讨论为什么1。不起作用

    编辑: 当使用echo而不是printf时,我得到了预期的结果,但是printf的工作方式为什么不同呢

        NewLine=`echo "\n"`
        echo -e "Firstline${NewLine}Lastline"
    
    结果:

    FirstlineLastline
    
    Firstline
     Lastline
    
        Firstline
        Lastline
    

    看起来BASH正在删除尾随的换行符。 e、 g

    如果添加“\r”,则工作正常

    $nl=`printf“\n\r”`&&echo“1${nl}2” 1. 2.
    backtick操作符删除尾随的新行。见3.4.5。命令替换at

    关于已编辑问题的说明 比较:

    [alvaro@localhost ~]$ printf "\n"
    
    [alvaro@localhost ~]$ echo "\n"
    \n
    [alvaro@localhost ~]$ echo -e "\n"
    
    
    [alvaro@localhost ~]$
    
    echo命令不会将
    \n
    视为换行符,除非您告诉他这样做:

    NAME
           echo - display a line of text
    [...]
           -e     enable interpretation of backslash escapes
    
    POSIX 7规定了这种行为:

    […]使用命令的标准输出,删除替换结束时一个或多个字符的序列


    您编辑的
    echo
    版本在变量
    $NewLine
    中放入一个反斜杠-n,然后由
    echo-e
    解释。如果您这样做:

    NewLine=$(echo -e "\n")
    echo -e "Firstline${NewLine}Lastline"
    
    您的结果将与案例1中的结果相同。要使这一点起作用,您必须避开反斜杠,并将整个内容放在单引号中:

    NewLine=$(printf '\\n')
    echo -e "Firstline${NewLine}Lastline"
    
    或者双重逃避:

    NewLine=$(printf "\\\n")
    
    当然,您可以直接使用
    printf
    ,也可以这样设置换行符值:

    printf "Firstline\nLastline\n"
    

    我们不需要“echo”或“printf”来创建换行变量:

    NewLine="
    "
    printf "%q\n" "${NewLine}"
    echo "Firstline${NewLine}Lastline"
    

    也许人们会带着和我一样的问题来到这里: 在用backstick包装的代码中\n回音。小贴士:

    printf "astring\n"
    # and 
    printf "%s\n" "astring" 
    # both have the same effect.
    # So... I prefer the less typing one
    
    简单的回答是:

    # Escape \n correctly !
    
    # Using just: printf "$myvar\n" causes this effect inside the backsticks:
    printf "banana
    "
    
    # So... you must try \\n  that will give you the desired 
    printf "banana\n"
    
    # Or even \\\\n if this string is being send to another place 
    # before echoing,
    
    buffer="${buffer}\\\\n printf \"$othervar\\\\n\""
    
    一个常见的问题是,如果在代码内部执行以下操作:

    echo 'Tomato is nice'
    
    当被反推线包围时,将产生错误

    command Tomato not found.
    
    解决方法是添加另一个echo-e或printf

    printed=0
    
    function mecho(){
      #First time you need an "echo" in order bash relaxes.
      if [[ $printed == 0 ]]; then
        printf "echo -e $1\\\\n"
        printed=1
      else
        echo -e "\r\n\r$1\\\\n"
      fi
    }
    
    现在,您可以在提示符下调试代码,只需执行以下操作:

    (prompt)$  `mySuperFunction "arg1" "etc"`
    
    输出将非常好

     mydebug: a value
     otherdebug: whathever appended using myecho
     a third string
    
    并使用

    mecho "a string to be hacktyped"
    

    对于想知道如何在
    printf
    的参数中使用换行符的人,请使用
    %b
    而不是
    %s

    $>printf“a%sa”“\n
    a\n
    $>printf“a%ba”“\n
    A.
    A.
    
    从手册中:

    %b在相应的参数中展开反斜杠转义序列


    Windows换行符是\r\n,如果您所指的是:-?这令人困惑,如果要挑剔的话,也是错误的。例如:在第二个代码块中,您说您转义了换行符,但实际上您只转义了反斜杠(“转义”)。很抱歉造成混淆。我会尽力澄清的。谢谢。对于这个答案也是如此。根据系统的说法,我们无法更新它,因为“它太旧了,需要更改”。问题是,这篇文章编辑部分的例子似乎并非如此,即部分:NewLine=
    echo“\n”
    ,因此我想结论是:1)Printf在这种情况下的工作方式与echo不同,因为echo需要“-e”为了创建实际的换行符2)删除printf和echo-e中的所有后续换行符,如中所述:下面丹尼斯·威廉姆森先生的帖子也有助于指出这些问题。谢谢!除了写入临时文件或管道之外,是否有POSIX 7解决方案来避免这种行为(我想保留换行符)?这是我的解决方案,至少从2011年起就可以使用(Bash 4.2.46)。非常感谢。