为什么 (( s )) 进行变量查找,而不是 [[ s ]]?

Why does (( s )) do a variable lookup, but not [[ s ]]?

假设我将以下脚本保存为 runme.sh

usage() { echo "Usage: [=10=] [-s <integer>] [-l <string>]" 1>&2; exit 1; }

while getopts ":s:l:" o; do
    case "${o}" in
        s)  s=${OPTARG}
            [[ $s =~ ^-?[0-9]+$ ]] || usage ;;
        l)  l=${OPTARG} ;;
        *)  usage ;;
    esac
done
echo "s = ${s}"
echo "p = ${p}"

输出如下:

$ ./runme.sh -s x -l hello
Usage: ./runme.sh [-s <integer>] [-l <string>]
$ ./runme.sh -s 1 -l hello
s = 1
l = hello

现在将其与 this thread 的最佳答案进行比较。后一个脚本似乎 运行 与我们是否有相同:

((s == 45 || s == 90))

(($s == 45 || $s == 90))

在第九行...

但是,对于我的脚本,我需要在 s 变量前面加上“$”,否则它只会给出上面显示的第一个输出,而不管 s 是否为整数。为什么是这样?我认为它与 [[ 和 (( 但我似乎找不到明确的答案。

(( )) 是数学上下文;在数学上下文中不需要显式 $(因为只有数字在那里有效,任何以非数字字符开头的标记都可以假定为变量名——并将被视为 0 该变量应该是 nonexistent/empty),但在其他任何地方都需要(因为在其他任何地方,a 可能表示字面字符 a,而不是 $a)。


重申一下:

[[ $s =~ ^-?[0-9]+$ ]]

...询问 $s 中的值是否与正则表达式匹配。


[[ s =~ ^-?[0-9]+$ ]]

...询问字母 s 是否与正则表达式匹配。


(( s == 0 ))

...本质上是一个数字比较,因此可以(因为s不是数字)查找[=19的值=] 确信没有其他含义是合理的。