Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 带参数扩展字符串替换的换行符printf解释_String_Bash_Shell_Parameter Expansion - Fatal编程技术网

String 带参数扩展字符串替换的换行符printf解释

String 带参数扩展字符串替换的换行符printf解释,string,bash,shell,parameter-expansion,String,Bash,Shell,Parameter Expansion,我有一个字符串:string=“foo=bar boo=far rab=oof raf=oob” 我想用换行符替换字符串中的所有空白:string=${string//$“\n”} 当我使用printf时,bash打印: ~$printf“%s”$string foo=bar\nboo=far\nrab=oof\nraf=oob 但是,当我错误地将命令输入为printf%s”“$string,我得到: ~$printf%s”“$string foo=bar boo=far rab=oof ra

我有一个字符串:
string=“foo=bar boo=far rab=oof raf=oob”

我想用换行符替换字符串中的所有空白:
string=${string//$“\n”}

当我使用
printf
时,bash打印:

~$printf“%s”$string
foo=bar\nboo=far\nrab=oof\nraf=oob
但是,当我错误地将命令输入为
printf%s”“$string
,我得到:

~$printf%s”“$string
foo=bar
boo=far
rab=oof
raf=oob
printf“%s”“$string”
printf%s”“$string
之间有什么区别,
printf
只解释其中一个命令中的换行符?

$“\n”
在当前区域设置中查找
\n
的翻译,但由于找不到任何内容,它只返回
\n
(详情请参见)

  • printf%s“$string”
    (不需要在%s周围加引号)获取$string的内容并按原样打印

  • printf%s”“$string
    将%s与空字符串和变量内容连接起来。
    \n
    因此进入模板并被解释为换行符

  • 您可以使用
    set-xv
    使shell向您显示它如何解释命令和变量

    从不安全的字符串创建printf模板是危险的。 我推荐一种不同的方式:

    s=${string// /$'\n'}
    printf %s "$s"
    
    $'\n'
    扩展为实际的换行符,因此$s将包含实际的换行符。然后您可以直接打印它

    另一种方法是

    printf '%s\n' $string
    
    不更改$string的值。不带引号的字符串将进行单词拆分,并使用向其添加换行符的模板打印每个生成的单词。

    $“\n”
    在当前区域设置中查找
    \n
    的翻译,但由于未找到任何内容,因此只返回
    \n
    (有关详细信息,请参阅)

  • printf%s“$string”
    (不需要在%s周围加引号)获取$string的内容并按原样打印

  • printf%s”“$string
    将%s与空字符串和变量内容连接起来。
    \n
    因此进入模板并被解释为换行符

  • 您可以使用
    set-xv
    使shell向您显示它如何解释命令和变量

    从不安全的字符串创建printf模板是危险的。 我推荐一种不同的方式:

    s=${string// /$'\n'}
    printf %s "$s"
    
    $'\n'
    扩展为实际的换行符,因此$s将包含实际的换行符。然后您可以直接打印它

    另一种方法是

    printf '%s\n' $string
    

    不更改$string的值。不带引号的字符串将进行单词拆分,并使用向其添加换行符的模板打印每个生成的单词。

    根据bash手册页,您不是用换行符替换,而是用反斜杠和n个字符替换:

    以美元符号($“字符串”)开头的双引号字符串将导致根据当前区域设置翻译字符串。如果当前区域设置为C或POSIX,则忽略美元符号。如果翻译并替换字符串,则替换为双引号

    (我怀疑您想使用带两个单引号的$“”。)

    printf命令将“\n”解释为换行符的转义序列,但仅在第一个参数中,这是命令中发生的情况:

    printf %s""$string
    

    根据bash手册页,您不是用换行符替换,而是用反斜杠和n个字符替换:

    以美元符号($“字符串”)开头的双引号字符串将导致根据当前区域设置翻译字符串。如果当前区域设置为C或POSIX,则忽略美元符号。如果翻译并替换字符串,则替换为双引号

    (我怀疑您想使用带两个单引号的$“”。)

    printf命令将“\n”解释为换行符的转义序列,但仅在第一个参数中,这是命令中发生的情况:

    printf %s""$string
    

    使用
    $'\n'
    而不是
    $“\n”
    例如
    字符串=${string///$'\n'}
    只是
    printf${string///'\n'}
    工作使用
    $'\n'
    而不是
    $“\n”
    例如
    字符串=${string///$'\n'}/code>只是
    printf string/'\n'}
    worksThank!仍然对bash中的单引号和双引号感到困惑谢谢!仍然对bash中的单引号和双引号感到困惑