14

我用谷歌搜索并尝试了很多东西,但从来没有用 ${parameter@operator} 得到任何东西。我发现的只是指向相同文档的更多链接。所以我认为用实际例子来正确回答对理解它很有帮助。

文档说:

${参数@操作员}

扩展要么是参数值的转换,要么是有关参数本身的信息,具体取决于运算符的值。每个运算符都是一个字母:

Q
扩展是一个字符串,它是以可重复用作输入的格式引用的参数值。

它还提到了引用:

3.1.2 引用
引用用于去除某些字符或单词对shell 的特殊含义。

所以我的推理是这个(特殊字符$)的输出:

a="To be reused as an input string, \$0 needs to be quoted"
echo ${a@Q}

应该是这样(在“”之间,'\'被删除,所以需要再次引用以用作输入):

To be reused as an input string, \$0 needs to be quoted

但我得到:

bash: ${a@Q}: bad substitution

我尝试了不同的组合:

${a@q}, "${a@Q}", a='To be reused as an input string, $0 needs to be quoted'

无济于事。

实际上,我尝试使用的任何运算符总是会产生错误的替换错误。这些似乎是 bash 非常晦涩的功能。我已经从这篇文章中省略了大约半小时的尝试,每一个都比以前更扭曲!

4

2 回答 2

17

对于那些来到这里寻找不同扩展运算符信息的人,这里是可用扩展字符及其效果的快速列表。

${varname@Q}返回一个带有任何特殊字符(如 \n、\t 等)转义的单引号字符串。

例子:

$ foo="one\ntwo\n\tlast"
$ echo "$foo"
one\ntwo\n\tlast

$ echo ${foo@Q}
'one\ntwo\n\tlast'

${varname@E}返回一个包含所有转义字符E扩展的字符串(例如 \n -> 换行符)。

例子:

$ foo="one\ntwo\n\tlast"
$ echo "${foo}"
one\ntwo\n\tlast

$ echo "${foo@E}"
one
two
        last

${varname@P}返回一个字符串,该字符串显示该变量如果用作P rompt 变量(即 PS1、PS2、PS3)会是什么样子

例子:

$ bar='host: \h'
$ echo ${bar@P}
host: myhost1

(还有更多的转义序列可以应用于提示变量。请参阅bash 文档。)

${varname@A}返回一个字符串,该字符串可用于A使用其现有名称、值和declare选项(如果有)为变量签名。

例子:

$ foo="test1"
$ echo ${foo@A}
foo='test1'

$ declare -i foo=10
$ echo "${foo@A}"
declare -i foo='10'

${varname@a}返回一个字符串,列出变量的A贡献。

例子:

$ declare -ir foo=10
$ echo ${foo@a}
ir

(可用的声明选项有:-r只读、-i整数、-a数组、-f函数、-x可导出。)

于 2017-01-30T16:18:38.263 回答
5

抱歉,我没有正确浏览 Stack,这里有一个使用示例:

如何将具有多行的文件显示为带有转义字符(\n)的单个字符串

$ foo=$(<file.txt)
$ echo "${foo@Q}"
$'line1\nline2'

另外,我没有实现该功能的 bash 4.4 < sigh >

于 2016-11-22T01:13:24.780 回答