Bash 为什么'$';可以在let构造中省略

Bash 为什么'$';可以在let构造中省略,bash,syntax,scripting,Bash,Syntax,Scripting,$符号可以在let和(…)构造中省略 既然在使用if或while时必须使用$,为什么会这样 ((i++)) or let i++ 只要增加i。它是对值执行的操作。它只返回退出代码,而不返回任何内容 var=$((i+2)) 将美元((i+2))扩展为其总和。 它返回一个结果 只要增加i。它是对值执行的操作。它只返回退出代码,而不返回任何内容 var=$((i+2)) 将美元((i+2))扩展为其总和。 它返回一个结果 算术表达式只处理整数,不处理字符串。因此,如果字符串出现在表达式中,唯

$
符号可以在
let
(…)
构造中省略

既然在使用
if
while
时必须使用
$
,为什么会这样

((i++)) or let i++
只要增加i。它是对值执行的操作。
它只返回退出代码,而不返回任何内容

var=$((i+2))
将美元((i+2))扩展为其总和。
它返回一个结果

只要增加i。它是对值执行的操作。
它只返回退出代码,而不返回任何内容

var=$((i+2))
将美元((i+2))扩展为其总和。
它返回一个结果


算术表达式只处理整数,不处理字符串。因此,如果字符串出现在表达式中,唯一合理的解释方法是将其作为变量展开(必要时递归展开),直到得到整数

在其他上下文中,字符串是允许的,因此区分字符串
foo
和变量
foo
的值的唯一方法是为参数扩展使用显式语法(
foo
是字符串,
$foo
生成参数值
foo


这一切的根源在于shell不会将变量传递给函数或命令;实际上,您只需展开宏并传递结果值。

算术表达式只处理整数,而不处理字符串。因此,如果字符串出现在表达式中,唯一合理的解释方法是将其作为变量展开(必要时递归展开),直到得到整数

在其他上下文中,字符串是允许的,因此区分字符串
foo
和变量
foo
的值的唯一方法是为参数扩展使用显式语法(
foo
是字符串,
$foo
生成参数值
foo


这一切的根源在于shell不会将变量传递给函数或命令;实际上,您只需展开宏并传递结果值。

因为$放在((因此指定双括号内的变量需要展开)。我认为这来自ksh,所以答案可能是因为David Korn在添加
$(())
(())时希望如此
到他的壳里去。作为旁白:你可能会想到
[
/
[[
关于强制性的
$
,而不是
如果
而本身
,考虑到
(…)
也可以用作
if
while
的条件;例如,
如果让'foo==1',那么echo yes;else echo no;fi
如果((foo==1));那么echo yes;else echo no;fi
@ramansailpal:请注意,问题是关于
$
内部
(…)的使用
,为了引用变量,不是关于
(…)
$(…)
之间的区别。此外,内部是否展开语法变量以及展开语法变量的方式与
(…)
$(…)无关
被选中-唯一的区别是后者输出算术计算的结果,而前者不输出。因为$放在((因此指定双括号内的变量需要展开。我认为这来自ksh,因此答案是因为David Korn在他的shell中添加
$(())
(())
let
时希望如此。顺便说一句:您可能正在考虑
[
/
[[
关于强制
$
,而不是
if
while
本身,假设
let
(…)
也可以用作
if
while
的条件;例如,
如果让'foo==1',则回显是;否则回显否;fi
if((foo==1));然后echo yes;否则echo no;fi
@RamanSailopal:请注意,问题是关于在
(…)
中使用
$
,以引用变量,而不是
(…)
$(…)之间的差异
。此外,内部是否展开语法变量以及展开语法变量的方式与是否选择了
(…)
$(…)
无关-唯一的区别是后者输出算术计算的结果,而前者不输出。这不是真的;如果i为0,(++i))将在非零结果上返回0-success;((i++)将返回1-false,因为它会在算术上下文中递增,而不是在退出代码布尔值中。进行了一些编辑。True,但问题是关于
$
内部
的使用(…)
,为了引用变量,而不是关于
(…)
$(…)
之间的区别。为了避免术语混淆,我建议使用return一词仅指退出代码,而生成的数据是[stdout]输出。换句话说:
$(…)
生成输出,而
(…)生成输出
不要这样做。它们都会像任何命令一样返回退出代码。这不是真的;如果i为0,(++i))将返回0-非零结果的成功;((i++)将返回1-false,因为它在算术上下文中是递增的,而不是退出代码布尔值。进行了一些编辑。True,但问题是关于在
(…)
内部使用
$
,以便引用变量,而不是
(…)
$(…)之间的差异
。为了避免术语混淆,我建议使用return一词仅指退出代码,而生成的数据是[stdout]输出。换句话说:
$(…)
生成输出,而
(…)
不生成。所有这些都是错误的-