对于bash中的循环语法,为什么条件部分和增量部分c样式中不需要带变量名的$?

对于bash中的循环语法,为什么条件部分和增量部分c样式中不需要带变量名的$?,bash,Bash,for((i=1;i主要用于算术表达式的构造(…)不需要$来引用变量,我不知道为什么(可能是为了让表达式具有C风格的外观) 在您的示例代码中,您可以使用if((i%2==0)),不带$,因为有双括号。主要用于算术表达式的构造(…)不需要$来引用变量,我不知道为什么(可能是为了让表达式具有C样式的外观) 在示例代码中,由于双括号的原因,如果((i%2==0))不带$,则可以使用。(())创建算术上下文。引用自: 在表达式中,shell变量也可以通过名称引用 不使用参数扩展语法 bash尝试展开名称

for((i=1;i主要用于算术表达式的构造(…)不需要$来引用变量,我不知道为什么(可能是为了让表达式具有C风格的外观)

在您的示例代码中,您可以使用
if((i%2==0))
,不带$,因为有双括号。

主要用于算术表达式的构造(…)不需要$来引用变量,我不知道为什么(可能是为了让表达式具有C样式的外观)

在示例代码中,由于双括号的原因,如果((i%2==0))
不带$,则可以使用

(())
创建算术上下文。引用自:

在表达式中,shell变量也可以通过名称引用 不使用参数扩展语法

bash
尝试展开名称,直到找到有效值为止(如果达到限制,将出现错误):

创建算术上下文的其他构造示例:

#regular arrays, doesn't work like that for associative arrays
declare -a arr=(a b c d)
num=2
echo "${arr[num]}"    #prints "c"

#substring expansion
var=foobar
echo "${var:num}"     #prints "obar"

#etc
甚至带有一些运算符的
[[]]
也会创建一个算术上下文(注意
[]
的行为不同):


那么有什么理由使用
$

例如,由于有了
$
,您可以使用参数扩展,例如子字符串扩展:

var=foo123
echo "$((${var:3} + 5))"    #prints "128"
另一个示例可能是指定一个基准:

foo=09
echo "$((foo))"        #error
echo "$((10#foo))"     #error
echo "$((10#$foo))"    #ok - prints "9"
正如我所提到的,关联数组(用
declare-A
声明)不创建算术上下文(因为索引不必是数字):


你的例子:

#arithmetic context - no need for $
for (( i = 1; i <= 5; i++ ))

#arithmetic context - no need for $
if (( i % 2 == 0 ))

#if it's a regular array: arithmetic context - no need for $
b[i]=$(( -1 * b[i] ))

#NO arithmetic context - $ needed
echo "Random number $i: $RANDOM"
#算术上下文-无需$
for((i=1;i
(())
创建一个算术上下文。引用自:

在表达式中,shell变量也可以通过名称引用 不使用参数扩展语法

bash
尝试展开名称,直到找到有效值为止(如果达到限制,将出现错误):

创建算术上下文的其他构造示例:

#regular arrays, doesn't work like that for associative arrays
declare -a arr=(a b c d)
num=2
echo "${arr[num]}"    #prints "c"

#substring expansion
var=foobar
echo "${var:num}"     #prints "obar"

#etc
甚至带有一些运算符的
[[]]
也会创建一个算术上下文(注意
[]
的行为不同):


那么有什么理由使用
$

例如,由于有了
$
,您可以使用参数扩展,例如子字符串扩展:

var=foo123
echo "$((${var:3} + 5))"    #prints "128"
另一个示例可能是指定基:

foo=09
echo "$((foo))"        #error
echo "$((10#foo))"     #error
echo "$((10#$foo))"    #ok - prints "9"
正如我所提到的,关联数组(用
declare-A
声明)不创建算术上下文(因为索引不必是数字):


你的例子:

#arithmetic context - no need for $
for (( i = 1; i <= 5; i++ ))

#arithmetic context - no need for $
if (( i % 2 == 0 ))

#if it's a regular array: arithmetic context - no need for $
b[i]=$(( -1 * b[i] ))

#NO arithmetic context - $ needed
echo "Random number $i: $RANDOM"
#算术上下文-无需$

对于((i=1;我不仅仅是“大部分”--它是“算术上下文”,如中所述,这就是文档中所称的。
=
成为一个赋值;
另外,请注意,
$(())
是POSIX标准化的,但是
(())
不是-
/bin/sh
,我们需要更像
的东西,如果[“$((i%2))”-eq 0]
。不仅仅是“大部分”--它是“算术上下文”,就像在中一样,这在文档中被称为。
=
成为一个赋值;
另外,请注意,
$(())
是POSIX标准化的,但是
(())
不是-
/bin/sh
,我们需要更像
如果[“$((i%2))”-eq 0]
b[i]
如果
b
是一个数字索引(vs关联)数组,则它是有效的。在关联数组中,
i
是一个字符串形式的有效键名,因此自动数字求值是不安全的……就此而言,这里有三种不同的上下文:
$(())
是POSIX指定和标准化的,而
(())
本身是ksh扩展(其行为与标准化语法相同)…而数组根本不是POSIX指定的。您所询问的
-循环语法的
在中有详细描述,并且在中有一个关于bash中算术扩展的好页面。但是,除此之外,我不知道您的问题是什么,因此也不知道如何回答。“语言设计者为什么选择使用X?”这不是一个真正可以云计算的问题——是大卫·科恩(David Korn)做出了手头的决定(尽管后来部分被奥斯汀小组采纳),所以如果你想要一个规范的答案,你需要去找他。(“语法X为什么有用?”更容易回答,但范围也相当广泛)。
b[i]如果
b
是一个数字索引(vs关联)数组,则
有效。在关联数组中,
i
是一个字符串形式的有效键名,因此自动数字求值是不安全的……就此而言,这里有三种不同的上下文:
$(())
是POSIX指定和标准化的,而
(())
本身就是一个ksh扩展(其行为与标准化语法相同)…而数组根本不是POSIX指定的。您所询问的
-循环语法的
在中有详细描述,并且在中有一个关于bash中算术扩展的好页面。但是,除此之外,我不知道您的问题是什么,因此也不知道如何回答。“语言设计者为什么选择使用X?”这不是一个真正可以云计算的问题——是大卫·科恩(David Korn)做出了手头的决定(尽管后来部分被奥斯汀小组采纳),所以如果你想要一个规范的答案,你需要去找他。(“语法X为什么有用?”更容易回答,但范围也相当广泛)。