当字符串有反斜杠时使用 printf

当字符串有反斜杠时使用 printf

我正在尝试两者printf以及export用于设置的变量PS1,但我尝试的所有内容都会返回错误printf\u在提示中放入文字。

v='\u\$'; printf "$v"; export PS1="$v"
-bash: printf: missing unicode digit for \u

v='\\u\$'; printf "$v"; export PS1="$v"
\u$

v=$'\u'; v+='\$'; printf "${v}"; export PS1="${v}"
-bash: printf: missing unicode digit for \u

有没有一种格式化方法$v可以使两者都printf工作export

答案1

这会失败,因为将printf第一个参数中的一些反斜杠字母解释为特殊字母。

一般来说,当使用printf您的电源时

  1. 静态格式化字符串,可能包含应从其他参数获取的数据的占位符,以及
  2. 在静态格式字符串的占位符中使用的其他变量数据。

这意味着第一个参数printf可以总是是单引号字符串。

在 shell 中,您可以将其用作%s格式化字符串中几乎任何内容的占位符,除非您想要左/右填充之类的内容(例如,%20s为右对齐字符串或%-20s左对齐字符串使用 20 个字符),浮点数中一定数量的小数位(%.3f对于三位小数),或整数的零填充(%08d对于八位数字,零填充)等。

例如,要打印字符串,请%s在格式化字符串中使用:

v='\u\$'
printf 'PS1 will be set to "%s"\n' "$v"   # or just:  printf '%s\n' "$v"
PS1="$v"

或者

PS1='\u\$'
printf 'PS1 was set to "%s"\n' "$PS1"   # or just:  printf '%s\n' "$PS1"

这将输出

PS1 will be set to "\u\$"

PS1 was set to "\u\$"

请参阅printf(1)和/或printf(3)在您的系统上 (man 1 printfman 3 printf)。


另请注意,PS1不需要导出。

相关内容