Bash:如何使用运算符参数扩展${parameter@operator}?

问题描述 投票:0回答:2

我用谷歌搜索并尝试了很多东西,但从来没有找到任何可以与 ${parameter@operator} 一起使用的东西。我发现的只是同一文档的更多链接。所以我认为一个正确的答案和实际的例子对于理解它是非常有帮助的。

文档说:

${参数@操作符}

扩张要么是对 参数值或参数本身的信息,取决于 运算符的值。每个运算符都是一个字母:


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

它还提到了引用:

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 非常晦涩的功能。我在这篇文章中省略了大约半个小时的尝试,每一次都比前一次更加扭曲!

bash operator-keyword quoting parameter-expansion
2个回答
31
投票

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

${varname@Q}
返回带有任何特殊字符(例如 ,,等等)逃脱了。 示例:

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

${varname@E}

 返回包含所有转义字符 
Expanded 的字符串(例如 -> 换行)。 示例:

$ foo="one\ntwo\n\tlast" $ echo "${foo}" one\ntwo\n\tlast $ echo "${foo@E}" one two last

${varname@P}

 返回一个字符串,显示变量用作 
Prompt 变量(即 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
可导出。)
    


6
投票

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

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

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

< sigh >

© www.soinside.com 2019 - 2024. All rights reserved.