如何在别名数组内打印“`”和“%”字符?

如何在别名数组内打印“`”和“%”字符?

我的键盘上的按钮有些问题,我已经更换了 3 次键盘。我暂时将 printf 用于一些文本编辑器。我需要在别名上使用颜色在数组内打印“`”和“%”字符,但根本不起作用。
基本上在 bash 中是这样的:

printf "[%c%c%c]\n", '`', '`', '%';

输出 :

[``%]

我尝试这个:

alias key='printf "\n\033[33m= "[ %c%c%c~+ |\ ]\n\n", '`', '`', '%'" '

在别名上我收到此错误:

]nn, , %: command not found

别名上应该使用什么格式的字符?

提前致谢。

答案1

您在别名中使用反引号“`”...这些用于命令替换bash...尽管旧式和不应被使用,因为它们将来可能会过时,而当前的命令替换语法更受欢迎$( ... )...它们需要被转义,以便您能够将它们作为参数传递给printf并作为文字反引号,就像您所做的那样...就像这样:

alias key='printf "\n\033[33m [%s%s%s]\n\n" "\`" "\`" "%"'

对您有用的另一种方法即:

printf "[%c%c%c]\n", '`', '`', '%'

是因为它们被括在单引号中,这是告诉 bash 不要将它们处理为命令替换标记的另一种方式...但是当您在别名字符串中使用它并添加更多单引号时,整个引用边界会翻转并在反引号周围断开,即:

alias key='printf "\n\033[33m= "[ %c%c%c~+ |\ ]\n\n", '`', '`', '%'" '

并且反引号已被 bash 处理。

尽管应该可以正常解析,但在 bash 中不需要用逗号分隔printf参数。

而且,使用字符说明符%c通常不是必要的,因为字符串说明符%s可以与适当的引用/转义一起使用,并且应该更加灵活。

答案2

忽略多余的逗号(,)字符,此处的问题在于引用。

反引号是弃用的语法命令替换, 和保留双引号内的特殊含义.因此

printf '%c%c\n' '`' '`'

作品,

printf '%c%c\n' "`" "`"

相当于printf '%c%c\n' "$(" ")",它尝试将文字空格作为命令执行,并将结果作为参数传递给printf

$ printf '%c%c\n' "`" "`"
 : command not found

那么,为什么不能简单地使用单引号形式来定义别名呢?嗯:

  1. 单引号不能嵌套,因此

    alias key='printf '%c%c\n' '`' '`' ' 
    

    'printf '%c%c\n和连接' '成一个格式字符串,保留 (不带引号)

    `' '`' '
    

    您的交互式 shell 将其扩展为等效于$(' ')' '- 再次尝试执行文字空间。

  2. 另一方面,如果你尝试使用外部双引号

    alias key="printf '%c%c\n' '`' '`' "
    

    然后根据上面链接的引用规则,单身的引号变为文字,并且你的 shell 再次扩展' '为命令。

工作就是逃脱单引号:

$ unalias key
$ alias key='printf "%c%c\n" '\''`'\'' '\''`'\'' '
$ 
$ key
``

你的完整别名是

alias key='printf "\n\033[33m= [ %c%c%c~+ |\ ]\n\n" '\''`'\'' '\''`'\'' "%" '

(尽管引用"%"并非绝对必要)。

如果“倾斜的牙签”变得难以处理,您可以考虑使用 shell 函数而不是别名,从而消除一级引用1

$ key () { printf '\n\033[33m= [ %c%c%c~+ |\ ]\n\n' '`' '`' '%' ; }
$ 
$ key

= [ ``%~+ |\ ]

也可以看看在 Bash 中,何时使用别名,何时使用脚本以及何时编写函数?


  1. 事实上,bash 手册本身的别名部分“对于几乎所有用途而言,shell 函数都比别名更受欢迎。”

相关内容