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

Buo*_*uoy 1 bash prompt printf

我正在尝试同时使用printfexport用于设置的变量,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
Run Code Online (Sandbox Code Playgroud)

有没有一种方法来格式化$v,以使双方printfexport工作?

Kus*_*nda 8

这失败了,因为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"
Run Code Online (Sandbox Code Playgroud)

或者

PS1='\u\$'
printf 'PS1 was set to "%s"\n' "$PS1"   # or just:  printf '%s\n' "$PS1"
Run Code Online (Sandbox Code Playgroud)

这将输出

PS1 will be set to "\u\$"
Run Code Online (Sandbox Code Playgroud)

PS1 was set to "\u\$"
Run Code Online (Sandbox Code Playgroud)

查看printf(1)和/或printf(3)在您的系统上(man 1 printfman 3 printf)。


还要注意,PS1不需要导出。