if 条件中的括号:为什么我会收到没有空格的语法错误?

if 条件中的括号:为什么我会收到没有空格的语法错误?

当脚本在一年的开始两天运行时,我使用下面的脚本将其向后移动两天,并检查每个月的第一天和第二天,并将其向后移动两天。

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)的双括号语法也是如此。

多个条件

条件组合有两种方式:

  1. 之内[

  2. 与单独的[命令结合&&||

在 中用括号分组可能更容易[

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

相关内容