gpt4 book ai didi

bash - Bash 中带引号修饰符的引号参数扩展

转载 作者:行者123 更新时间:2023-11-29 09:23:17 25 4
gpt4 key购买 nike

我注意到了一些奇怪的事情:

Y=""
echo ${Y:-"\n"}
echo "${Y:-"\n"}"

打印

\n
n

为什么第二行是n,而不是\n?这是错误吗?

看起来好像 Bash 将其解析为两个带引号的字符串的串联,中间有一个不带引号的字符串 ("${Y:-" and \n and "}") 但是这似乎不是因为命令

echo $(echo "\n")
echo "$(echo "\n")"
echo "${Y:-"'\n'"}"

输出

\n
\n
'n'

我使用的是 GNU bash,版本 4.3.11。

最佳答案

我怀疑在处理 :- 之后的单词时存在错误(事实上,我似乎记得读过一些关于此的内容,但我不记得在哪里)。

如果未引用该值,我会得到我期望的结果...

$ echo ${Y:-\n}
n
$ echo "${Y:-\n}"
\n

这也是您在 dash 中得到的结果(忽略 dash 实际上产生文字换行符的事实,因为 POSIX 要求 echo 应该处理转义字符,bash 只有在您使用非标准的 -e 选项时才会执行此操作。)

在此示例中,引用默认值会保留反斜杠。由于参数扩展的结果产生反斜杠,引号删除不会将其删除。

$ echo ${Y:-"\n"}   # Equivalent to echo "\n", so the output makes sense
\n

bash 似乎没有任何理由在最后一个示例中表现不同,只是因为引用了整个参数扩展。这几乎就像引用删除应用了两次,一次是删除外部双引号,另一次是错误地删除反斜杠。

# Quote removal discards the backslash: OK
$ echo \n
n
# Quote removal discards the double quotes: OK
$ echo "n"
n
# Quote removal discards the first backslash after `\\` is recognized
# as a quoted backslash: OK
$ echo \\n
\n
# Quote removal discards the double quotes, but leaves
# backslash: OK
$ echo "\n"
\n
# Is quote removal discarding both the double quotes *and* the backslash? Not OK
$ echo "${Y:-"\n"}"
n

相关的,zsh(使用bsd_echo)选项集输出\n,而不是n

% Y=""
% echo "${Y:-"\n"}"
\n

关于bash - Bash 中带引号修饰符的引号参数扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37752879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com