为什么 (( 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的值=] 确信没有其他含义是合理的。
假设我将以下脚本保存为 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的值=] 确信没有其他含义是合理的。