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

Fir*_*ume 9 bash quoting operator-keyword parameter-expansion

我用谷歌搜索并尝试了很多东西,从来没有任何东西可以使用$ {parameter @ operator}.我找到的只是更多链接到相同的文档.因此,我认为通过实际例子得到正确答案对其理解非常有帮助.

文件说:

$ {参数@操作}

扩展可以是参数值的变换,也可以是参数本身的信息,具体取决于运算符的值.每个运营商都是一个字母:

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

它还说引用:

3.1.2引用
引用用于删除shell中某些字符或单词的特殊含义.

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

a="To be reused as an input string, \$0 needs to be quoted"
echo ${a@Q}
Run Code Online (Sandbox Code Playgroud)

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

To be reused as an input string, \$0 needs to be quoted
Run Code Online (Sandbox Code Playgroud)

但我得到:

bash: ${a@Q}: bad substitution
Run Code Online (Sandbox Code Playgroud)

我尝试了不同的组合:

${a@q}, "${a@Q}", a='To be reused as an input string, $0 needs to be quoted'
Run Code Online (Sandbox Code Playgroud)

无济于事.

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

Ric*_*eak 7

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

${varname@Q}返回单Q uoted串与任何特殊字符(如\ N,\吨等)逃出。

例子:

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

$ echo ${foo@Q}
'one\ntwo\n\tlast'
Run Code Online (Sandbox Code Playgroud)

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

例子:

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

$ echo "${foo@E}"
one
two
        last
Run Code Online (Sandbox Code Playgroud)

${varname@P}返回一个字符串,该字符串显示该变量用作P rompt变量(即PS1,PS2,PS3)时的外观

例:

$ bar='host: \h'
$ echo ${bar@P}
host: myhost1
Run Code Online (Sandbox Code Playgroud)

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

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

例:

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

$ declare -i foo=10
$ echo "${foo@A}"
declare -i foo='10'
Run Code Online (Sandbox Code Playgroud)

${varname@a}返回列出该变量的A致敬的字符串。

例:

$ declare -ir foo=10
$ echo ${foo@a}
ir
Run Code Online (Sandbox Code Playgroud)

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


Fir*_*ume 6

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

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

$ foo=$(<file.txt)
$ echo "${foo@Q}"
$'line1\nline2'
Run Code Online (Sandbox Code Playgroud)

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