&2; exit 1; } while getopts ":s:l:" o;-6ren">
gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:55 26 4
gpt4 key购买 nike

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

usage() { echo "Usage: $0 [-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 如果该变量不存在/为空),但在其他任何地方都需要(因为在其他任何地方,a 可能表示文字字符 a,而不是 $a 的意思)。


重申一下:

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

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


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

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


(( s == 0 ))

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

关于linux - 为什么 (( s )) 进行变量查找,而不是 [[ s ]]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28954282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com