bash 中变量名前什么时候可以选择使用“$”字符?

cor*_*sco 7 bash

有人可以解释为什么这是有效的,特别是我没有在 if 语句内的变量名称之前使用 \xe2\x80\x98$\xe2\x80\x99 字符这一事实?我搜索了Bash 参考手册,但找不到解释。

\n
#!/usr/bin/env bash\n\none="$1"\ntwo="$2"\nthree="$3"\nfour="$4"\n\nif [[ one -le two ]] && [[ three -ge four ]]; then\n        echo "TRUE:  $one <= $two && $three >= $four"\nelse\n        echo "FALSE: $one <= $two && $three >= $four"\nfi\n
Run Code Online (Sandbox Code Playgroud)\n

我也用这样的循环对其进行了测试,效果非常好

\n
for x1 in {1..3}; do\nfor x2 in {1..3}; do\nfor x3 in {1..3}; do\nfor x4 in {1..3}; do ./test $x1 $x2 $x3 $x4;\ndone; done; done; done | sort\n
Run Code Online (Sandbox Code Playgroud)\n

Cha*_*ffy 7

美元符号在算术上下文中是可选的。这是将值解释为数字的任何上下文。

  • $(( ... ))在所有 POSIX shell 中创建算术上下文
  • (( ... ))在 bash 中创建算术上下文,包括在for ((expr1; expr2; expr3)).
  • let在 shell(如 bash)中创建一个算术上下文,支持古老的、POSIX 之前的非标准语法。
  • ${array[idx]}or中array[idx]=valueidx只要数组未声明为关联数组,就会被计算为算术。
  • 在 中[[ value1 -le value2 ]],because-le是算术运算符(它只进行数字比较,不进行字符串比较),并且 和value1value2被解析为算术运算符。-eq对于、-ne-lt和也是如此-gt-ge
  • 在 中${string:start:len}, 和start都是len算术上下文。
  • declare -i variable将变量声明为数字类型并variable=value随后运行时,value就是算术上下文。

请注意,对于或命令内部的算术比较而言,情况并非如此;(无论是否以名称调用)的行为类似于常规 shell 命令,而不是特殊语法(尽管有内置实现作为性能优化)。test[test[


Bar*_*mar 6

在Bash 条件表达式的描述中,算术比较运算符( 、 等)的描述-lt如下-gt

当与 [[ 命令一起使用时,Arg1Arg2将被计算为算术表达式(请参阅Shell Arithmetic)。

当您点击该链接时,它会显示:

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

算术扩展的描述是$((expression))这样的:

表达式中的所有标记都会经历参数和变量扩展、命令替换和引号删除。...评估是根据下面列出的规则进行的(参见壳算术)。

  • @CharlesDuffy 问题开始于“有人可以解释一下为什么它有效吗”,然后继续说他在文档中找不到它。我在他的文档中找到了它。 (2认同)