Bash脚本,检查范围内的数值变量

Bash脚本,检查范围内的数值变量,bash,Bash,这是我的剧本: #!/bin/bash JOB_NUM=4 function checkJobNumber() { if (( $JOB_NUM < 1 || $JOB_NUM > 16 )); then echo "pass" fi } ... checkJobNumber ... #/bin/bash 作业数量=4 函数checkJobNumber(){ 如果($JOB_NUM16)),则 回音“通行证” fi } ... 支票工号 ...

这是我的剧本:

#!/bin/bash
JOB_NUM=4

function checkJobNumber() {
    if (( $JOB_NUM < 1 || $JOB_NUM > 16 )); then
        echo "pass"
    fi
}

...
checkJobNumber
...
#/bin/bash
作业数量=4
函数checkJobNumber(){
如果($JOB_NUM<1 | |$JOB_NUM>16)),则
回音“通行证”
fi
}
...
支票工号
...
当我尝试启动脚本时,会收到以下消息:

./script.sh line 49: ((: < 1 ||  > 16 : syntax error: operand expected (error token is "< 1 ||  > 16 ")
/script.sh第49行:(:<1 | |>16:语法错误:应为操作数(错误标记为“<1 | |>16”)
(请注意错误消息中的空格)

我真的不明白问题出在哪里。如果我在命令行手动执行评估,它会工作


此外,我还尝试了不同的评估,如
if[[“$JOB_NUM”-lt 1-o“$JOB_NUM”gt 16];
…仍然没有成功。

更新:正如建议的那样,我在函数调用之外的其余代码中进行了几次尝试,发现了问题

我的变量声明实际上是这样缩进的:

JOB\u NUM=4
线程数=8
.....
非常长的变量名称=3
很明显,这是一种逃避。呸!我以前一直这样,为什么现在不行呢

如果我删除了空格,则评估将起作用:

JOB_NUM=4
THREAD_NUM=8
....
VERY_LONG_VAR_NAME=3
好吧,我正式讨厌bash…叹气:(

这会很好用的

#!/bin/bash
JOB_NUM=7

function checkJobNumber() {
if  [ $JOB_NUM -lt 0 ] || [ $JOB_NUM -gt 16 ] ; then
    echo "true"
else
    echo "false"
fi
}


checkJobNumber
如果您想在测试期间检查变量,可以在bash中编写:

set-u


如果变量设置不正确,这将生成一条类似“JOB_NUM:unbound variable”的消息

在调用函数时,
JOB_NUM
可能会被取消设置;但是,bash算术不需要
$
进行扩展。如果您编写
((JOB_NUM<1 | JOB_NUM>16))
即使变量未设置,它在语法上也是有效的–在这种情况下,它的计算结果将为零。如果我按照Mat所说的去做,我会在错误发生之前在输出中得到字符串“Job number is:[]”。我仍然不明白我做错了什么。顺便说一句,我的Job_NUM=4作业最初是Job_NUM=1作业(脚本的直接参数)。我还应该提到,我的函数都位于脚本之上,在调用函数之前,我不会对变量做任何操作。我只是不复制代码,因为这太离题了。这与您的问题无关,但通常应避免使用所有大写变量名,因为它们是“保留的”供shell等使用。尝试将
set-x
添加到脚本顶部,然后运行脚本,查看
JOB_NUM
在哪里设置/取消设置?@EtanReisner感谢您对我删除的答案的评论。您是对的,我是错的。如果您要忽略语言的语法,那么是的,您会讨厌结果。我保证不会在作业中在
=
之后添加空格的帽子从来都不起作用,在
bash
中不起作用,在任何
sh
派生的shell中也不起作用。更不用说抱怨抱怨抱怨你没有在问题中向我们展示你的实际代码……空格很重要。
JOB_NUM=4
在shell脚本中甚至不是有效的一行。运行它会得到你的答案u一个错误,
4
不是命令。伙计们,你们没事,我想我弄错了。顺便说一句,不显示代码的原因是因为它驻留在一台没有连接到互联网的机器上……所以我只想手动复制相关部分。