当脚本在一年的开始两天运行时,我使用下面的脚本将其向后移动两天,并检查每个月的第一天和第二天,并将其向后移动两天。
if [$month="01"] && [$day="01"]; then
date="$last_month/$yes_day/$last_year"
fulldate="$last_month/$yes_day/$last_year"
else
if [$month="01"] && [$day="02"]; then
date="$last_month/$yes_day/$last_year"
fulldate="$last_month/$yes_day/$last_year"
else
if [ $day = "01" ]; then
date="$last_month/$yes_day/$year"
fulldate="$year$last_month$yes_day"
else
if [ $day = "02" ]; then
date="$last_month/$yes_day/$year"
fulldate="$year$last_month$yes_day"
else
date="$month/$yes_day/$year"
fulldate="$year$month$yes_day"
fi
fi
fi
fi
但我的问题是收到以下错误消息
Etime_script.sh: line 19: [06=01]: command not found
Etime_script.sh: line 24: [06=01]: command not found
答案1
[
既不是元字符也不是控制运算符(甚至不是保留字;与 相同]
),因此它周围需要空格。否则,shell“看到”该命令而不是带有单独参数、、和 的[01=01]
命令。每个运算符和操作数都需要是命令的单独参数,因此运算符周围也需要空格。[
01
=
01
]
[
if [ "$month" = "01" ]
[$month="01"]
$month
是与 或中的任何字符匹配的通配符模式"01
。如果它不匹配任何内容,则将其保留。
如果右括号后面有一个分号,则前面不需要空格,因为分号始终是单独标记的一部分。
if [ "$month" = "01" ]; then
bash(以及 ksh 和 zsh)的双括号语法也是如此。
多个条件
条件组合有两种方式:
之内
[
与单独的
[
命令结合&&
或||
在 中用括号分组可能更容易[
。
if [ "$month" = "01" -a "$day" = "01" ] # -a for and, -o for or
if [ "$month" = "01" ] && [ "$day" = "01" ]
应避免第一个,因为它不可靠(例如尝试使用month='!'
)。首先使用安全字符串(如果有的话)可以避免奇怪的变量内容的问题;或者使用[[
/]]
代替[
/ ]
:
if [ "01" = "$month" -a "01" = "$day" ]
答案2
另一种写法:
case $month:$day in
(01:0[12])
date="$last_month/$yes_day/$last_year"
fulldate="$last_month/$yes_day/$last_year"
;;
(*:0[12])
date="$last_month/$yes_day/$year"
fulldate="$year$last_month$yes_day"
;;
(*)
date="$month/$yes_day/$year"
fulldate="$year$month$yes_day"
esac