对于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为什么有用?”更容易回答,但范围也相当广泛)。