Stanley Yu Asked: 2025-01-13 06:51:18 +0800 CST2025-01-13 06:51:18 +0800 CST 2025-01-13 06:51:18 +0800 CST bash 将未设置的参数扩展为空字符串是否有记录? 772 shellbash默认将未设置的参数扩展为空字符串。但是,我找不到任何官方文档说明这一点。是吗? bash 3 个回答 Voted Best Answer choroba 2025-01-13T08:07:53+08:002025-01-13T08:07:53+08:00 在 中man bash,您可以在“单词拆分”下找到以下内容: 显式空参数(""或'')被保留并作为空字符串传递给命令。未加引号的隐式空参数(由没有值的参数扩展而产生)将被删除。如果在双引号内扩展没有值的参数,则会产生空参数,并保留该空参数并将其作为空字符串传递给命令。当加引号的空参数作为扩展非空的单词的一部分出现时,将删除该空参数。也就是说,在拆分单词并删除空参数后,该单词-d''变为-d。 ilkkachu 2025-01-13T10:38:44+08:002025-01-13T10:38:44+08:00 当然: 2.6.2 参数扩展 参数扩展的最简单形式是: ${parameter} 如果有参数,则应替换该值。 (重点是我的) 不过,Bash 自己的参考手册似乎省略了“如果有”。 好吧,也许这不是太清楚,但 POSIX 文本确实有一个示例来展示这种行为。不过,这只是一个“信息性”部分。 ${parameter} 此示例演示了省略括号的效果。 a=1 set 2 echo ${a}b-$ab-${1}0-${10}-$10 1b--20--20 ``` ($ab此处未定义,并扩展为空字符串) jthill 2025-01-13T17:38:19+08:002025-01-13T17:38:19+08:00 我所知道的最接近的是在我看来的一个严格含义set -u: -u 执行参数扩展时,将未设置的变量和参数(特殊参数 @ 和,或以或 为*下标的数组变量除外)视为错误。如果尝试对未设置的变量或参数进行扩展,则 shell 会打印错误消息,如果不是交互式的,则以非零状态退出。@* 因此,如果您必须选择一个选项来将未设置变量的扩展视为错误,那么在我看来,当未设置该选项时只有一种合理的选择:扩展没有设置值的变量不会产生扩展值。 重新考虑将未设置的变量扩展为 的评论中的想法null,以及从长期经验来看:不。 shell 的核心目的是构造命令调用,将字符串集传递给execve,从一行开始。 突破其自然的五行地形非常容易(因为发现不必切换语言很方便),并且您所追求的东西已经可供任何想要它的人使用,几乎可以以您想要的任何形式获得。 想要实际错误?set -u。 想要扩展为 的未设置变量null?${var-null}。 对于如何处理这个问题,除了字面上的大量选项之外,还有大量选项。
在 中
man bash
,您可以在“单词拆分”下找到以下内容:当然:
2.6.2 参数扩展
(重点是我的)
不过,Bash 自己的参考手册似乎省略了“如果有”。
好吧,也许这不是太清楚,但 POSIX 文本确实有一个示例来展示这种行为。不过,这只是一个“信息性”部分。
(
$ab
此处未定义,并扩展为空字符串)我所知道的最接近的是在我看来的一个严格含义
set -u
:因此,如果您必须选择一个选项来将未设置变量的扩展视为错误,那么在我看来,当未设置该选项时只有一种合理的选择:扩展没有设置值的变量不会产生扩展值。
重新考虑将未设置的变量扩展为 的评论中的想法
null
,以及从长期经验来看:不。 shell 的核心目的是构造命令调用,将字符串集传递给execve
,从一行开始。 突破其自然的五行地形非常容易(因为发现不必切换语言很方便),并且您所追求的东西已经可供任何想要它的人使用,几乎可以以您想要的任何形式获得。 想要实际错误?set -u
。 想要扩展为 的未设置变量null
?${var-null}
。 对于如何处理这个问题,除了字面上的大量选项之外,还有大量选项。