Bash 如果选中,则Shell脚本的参数太多

Bash 如果选中,则Shell脚本的参数太多,bash,shell,Bash,Shell,我正在检查这一天是星期天还是星期五,以及时间是否晚于小时20 如果是这样,那么我想做点什么;如果没有,我想做点别的。 我正在使用/bin/sh 这给了我以下错误: 争论太多了 为什么? 谢谢您可能会认为“[”只是一个分组,您可以有不同的任意嵌套 事实并非如此 “[”是shell“test”命令的别名…您需要正确匹配它们: 几乎所有编写的shell脚本都使用这个测试 这样做是因为test通常不直接调用 通常称为[.]是指向测试的符号链接,只是为了 shell程序可读性更强。它通常也是一个shel

我正在检查这一天是星期天还是星期五,以及时间是否晚于小时
20

如果是这样,那么我想做点什么;如果没有,我想做点别的。
我正在使用
/bin/sh

这给了我以下错误:

争论太多了

为什么?

谢谢

您可能会认为“[”只是一个分组,您可以有不同的任意嵌套

事实并非如此

“[”是shell“test”命令的别名…您需要正确匹配它们:

几乎所有编写的shell脚本都使用这个测试 这样做是因为test通常不直接调用 通常称为[.]是指向测试的符号链接,只是为了 shell程序可读性更强。它通常也是一个shell内置程序 (这意味着外壳本身将[解释为意义测试, 即使Unix环境的设置不同):

查看此处了解更多详细信息(以及一些有用的示例):


尝试按如下方式调整代码

day_of_week=$(date -d $given_date +%u )
hour_of_day=${ST_job:0:2}
if [[ $day_of_week -eq 7  ||  $day_of_week -eq 5  &&  $hour_of_day -gt 20 ]] ; 
then
  echo  "something"
else
  echo "something else"
fi

将参数置于if条件下时,不需要再次使用方括号来分隔参数。

test命令(aka
[
)不嵌套。第一个
[
之后的任何内容都被视为表达式,您使用的表达式在语法上无效

就我个人而言,我发现带有
[
的复杂测试非常难看,它们让我想找到其他更具可读性和灵活性的解决方案。这里可以使用
语法中的
case
/

case $day_of_week/$hour_of_day in
  (7/* | 5/2[123]) echo "something";;
  (*)              echo "something else";;
esac

尝试验证/验证你的脚本。这回答了你的问题吗?它没有回答OP为什么会出错的问题……但这是一个很好的解决方案:)PS:你是1月12日出生的,还是?@FoggyDay查看我的个人资料:-)谢谢你在我的回答中挑了一个错误。我将很快解决它。@Jens如果我必须使用多个or(| | |)条件和and(&&&)条件?我如何知道我的&&将被哪个| |?它左边的一个或它右边的一个或所有?@invicus正如您所看到的,您可以“或”使用
的字符串的多个条件通过使用分隔符(此处为
/
)连接来设置日期和小时的条件要匹配的适当模式:5/21只在当天5点和小时21点时匹配。你明白了吗?@invitus如果你询问shell列表操作符
|
&&
,它们都具有同等的优先级,一旦确定结果,计算就会停止。这称为短路。
true |false
不评估错误部分。
false和&true
不评估正确部分。如果您坚持使用
[
,那么对于or使用
-o
-a
以及
进行分组。我相信shellscript.sh可能会有一点不稳定“全世界都是一个Linux系统。”
[
是否是一个符号链接还不太清楚。一些(很多?大多数?)Unixen选择将其作为一个指向
测试的硬链接。至少FreeBSD是这样做的。
day_of_week=$(date -d $given_date +%u )
hour_of_day=${ST_job:0:2}
if [[ $day_of_week -eq 7  ||  $day_of_week -eq 5  &&  $hour_of_day -gt 20 ]] ; 
then
  echo  "something"
else
  echo "something else"
fi
case $day_of_week/$hour_of_day in
  (7/* | 5/2[123]) echo "something";;
  (*)              echo "something else";;
esac