Git &引用${1-}";vs"$1“;

Git &引用${1-}";vs"$1“;,git,bash,bash-completion,Git,Bash,Bash Completion,gitbash完成的代码,特别是函数\uu gitcomp,使用类似“${1-}”的参数扩展。这似乎类似于“$1”。有什么区别 另外:这在bash手册的哪里有文档记录 echo "${foo-default}" 如果定义了foo,则打印$foo;如果未定义foo,则打印'default'。所以我得出结论 "${1-}" 如果未定义脚本的第一个参数,则为空。原始答案 设法真正注意到手册中的扩展->参数扩展介绍的细节。扩展用例列表前面的最后一句(:-,:+,等等)解释说,“省略冒号只会导致对未设

gitbash完成的代码,特别是函数
\uu gitcomp
,使用类似
“${1-}”
的参数扩展。这似乎类似于
“$1”
。有什么区别

另外:这在
bash
手册的哪里有文档记录

echo "${foo-default}"
如果定义了foo,则打印$foo;如果未定义foo,则打印'default'。所以我得出结论

"${1-}"
如果未定义脚本的第一个参数,则为空。

原始答案 设法真正注意到手册中的
扩展
->
参数扩展
介绍的细节。扩展用例列表前面的最后一句(
:-
:+
,等等)解释说,“省略冒号只会导致对未设置的参数进行测试。”如果使用
,则这些测试将针对未设置的或null参数

因此:

故事的寓意:不要只是浏览手册,RTFM

附录 乍一看,这个答案似乎无关紧要;困惑读者建议考虑“代码>回声”$ {马尔科维奇} /<代码>,然后在<代码>中使用的原始表单回响“${ 1 }”< /代码>。这是对我问题的回答,因为它向我自己以及熟悉默认参数展开形式的其他人解释了冒号可以省略


正如Gilles指出的,
“${1-}”
实际上与
“$1”
相同,除非
set-u
有效:在这种情况下,必须提供默认值,以避免变量未设置时出现错误。有关上下文和语法的详细解释,请参见Johnathan Lefler的答案。

Bash参考手册§3.5.3 Shell参数扩展说明:

当不执行子字符串扩展时,使用下面描述的形式,Bash测试 对于未设置或为null的参数。省略冒号只会导致对一个 未设置的参数。换句话说,如果包含冒号,则操作员将测试 参数的存在性及其值不为空;如果省略冒号,则运算符 只测试是否存在

如果参数为unset或null,则替换word的展开形式。否则,, 替换参数的值

(重点加上。)

如果在shell脚本中,
${1-}
出现在双引号内,那么它实际上不是编写
“$1”
的一种特别有用的方法。如果未定义
$1
,则
“${1-}”
“$1”
都展开为空参数;如果定义了
$1
但为空,则它们也会扩展为空参数;否则,即使
$1
包含空格,它也会作为被调用程序的一个参数出现

如果
${1-}
出现在双引号外,那么它仍然没有用处:如果
$1
未定义或为空,那么被调用的程序看不到任何参数(使用任一符号);如果定义了
$1
,则被调用的程序会根据
$1
的(拆分)值看到一个或多个参数,或者如果
$1
仅包含空白,则不会看到任何参数

当破折号后面有某种值时,符号才真正成为自己的符号。例如:

localvar=${ENVVAR1:-${ENVVAR2:-/opt/software}}

这表示“如果
$ENVVAR1
设置为非空值(包括所有空格),请使用它;否则,请查看
$ENVVAR2
,如果它被设置为非空值,请使用它;否则,使用值
/opt/software

首先,回想一下
${foo bar}
扩展为
foo
的值,如
$foo
${foo}
,除非
foo
未设置,
${foo bar}
扩展为
bar
$foo
如果
foo
未设置,则扩展为空字符串)。此语法有一个更常用的变体,
${foo:-bar}
,如果
foo
未设置或为空,则扩展为
bar
。(这是如果您仔细查看:搜索
:-
,并注意句子)省略冒号只会导致对未设置的参数进行测试

对于位置参数
$1
${1-bar}
如果
$1
未设置,即如果位置参数的数量小于1,则扩展到
条形
。除非位置参数已通过
设置
移位
进行更改,否则这意味着当前函数,或者如果不适用于当前脚本,则没有参数


现在当
bar
为空时,
${1-}
看起来像是一个无用的复杂因素:扩展是
$1
的扩展,除了当
$1
未设置时,扩展是空的,无论如何都是空的。使用
${1-}
的要点是在
set-u
下(也称
set-o
),如果参数未设置,普通的
$1
将导致错误,而
${1-}
如果
$1
未设置,则总是成功地扩展到空字符串。

参数扩展下的文档说明
${parameter:-word}
执行此操作,并且没有提到没有冒号的表单,
${parameter word}
。但这两种方法似乎都很好。我也很想看看文档/解释!@Jefromi:这是为了防止
set-u
生效。这个“答案”可能应该添加到问题中,尽管你对Bash手册中注释的观察是正确的(你的答案是在我输入我的时候到达的)@Jonathan:好吧,它至少为我回答了这个问题:我已经熟悉参数扩展中使用的
:-
,但没有意识到冒号可以省略。虽然它实际上没有说明在git完成函数中使用此表单的逻辑,但这不是我真正的问题。无论如何,这
${parameter:-word}
localvar=${ENVVAR1:-${ENVVAR2:-/opt/software}}