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

时间:2016-11-22 01:06:53

标签: bash operator-keyword quoting parameter-expansion

我已经用Google搜索并尝试了很多东西,并且永远无法使用$ {parameter @ operator}。我找到的只是更多链接到相同的文档。所以我认为用实际例子给出正确的答案对它的理解非常有帮助。

文档说:

  

$ {parameter @ operator}

     

扩张要么是转型   参数值或参数本身的信息,取决于   运营商的价值。每个运营商都是一个字母:

     

Q
  扩展是一个字符串,它是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的非常模糊的特征。我已经从这篇文章中省略了大约半小时的尝试,每次尝试都比以前更加扭曲!

2 个答案:

答案 0 :(得分:5)

对于到达此处寻找有关其他扩展运算符的信息的人,可以在此处找到可用扩展字符及其效果的快速列表。

${varname@Q} 会返回单个 Q 的字符串,其中包含任何特殊字符(例如\ n,\ t等)的转义。

示例:

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

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

${varname@E} 会返回一个字符串,其中包含所有转义字符 E xpanded(例如\ 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 documentation。)

${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可导出。)

答案 1 :(得分:2)

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

How to display a file with multiple lines as a single string with escape chars (\n)

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

另外,我没有bash 4.4,其中实现了该功能&lt;叹气&gt;