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中的单引号和双引号感到困惑