调用bash脚本会在if语句和变量赋值时生成错误

时间:2013-12-12 21:53:58

标签: linux bash shell command-line

我正在尝试执行一个非常简单的程序(将数字舍入到可被15整除的最低整数),但是收到错误:

$min = date +"%M";

if [ $min%15 != 0 ]
  then
    $min - $min%1
fi

echo $min;

我用sh cache.sh

来称呼它

我觉得我已经遵循了我学过的语法here但我得到了line 9: syntax error: unexpected end of file我在这里遇到了什么问题?

4 个答案:

答案 0 :(得分:2)

该脚本无效bash语法。我首先会找到一些有用的例子,也许还有整个教程。你可以从William Shotts的书开始,这是available online

有关您尝试的一些注意事项:

  1. $用于请求用其值替换变量 1 。它不是变量名称的一部分,因为它在Perl或PHP中。因此,它不会在作业的左侧使用。

  2. shell主要用于运行其他可执行文件,并通过该镜头解释所有内容。如果命令行看起来像是对另一个程序的调用,那么shell将尝试运行该其他程序,而不是执行任何shell-scripty。因此,命令min = date +"%M"将使shell查找名为min的程序,并使用三个命令行参数执行它:=date和{{1 }}。
    为了使作业得到承认,+%M周围不能有任何空间。

  3. 但是,如果没有空格,=仍然不对。 shell将暂时将文字字符串“date”分配给变量min=date +"%M",然后尝试运行名为min的命令。
    如果值中包含空格,则需要在其周围加上引号 2

  4. 但即使使用引号,+%M也会将min="date +%M"文字字符串“date +%M”分配给min。如果您确实希望运行命令 date +"%M"并将其输出用作值,则必须使用命令替换语法$(...)来请求。在这里,我们的朋友美元符号再次请求动态值替换,但括号使其成为不同类型的请求;而不是变量的值,表达式将被命令的输出替换。

  5. 由于上面提到的解析问题,内置算术运算仅适用于某些上下文。创建有效算术上下文的两种方法是(( ... ))特殊形式和let命令。

  6. 最后,即使你的脚本在语法上是有效的,如果你的目标是向下舍入到最接近的15的倍数,那么它在语义上是不正确的。除以1之后的余数总是为零,所以你的脚本以尝试结束要从min中减去0 - 并且无论如何都不会对结果做任何处理,因为没有赋值回min。如果要向下舍入,则必须实际减去刚刚测试的余数。你可以这样做:

    min=$(date +%M)
    let rem=min%15
    if (( rem != 0 )); then
      let min-=rem
    fi
    echo $min
    
  7. 但你也可以更简洁地做到这一点:

    echo $(( min=$(date +%M), min-=min%15 ))
    

    这可以在没有if的情况下工作,因为减去0是无害的。逗号只是让我们将两个表达式放在一组((...))中。第二个表达式min-=min%15是一个修改赋值 - 它与min=min-min%15的含义相同,但为我们节省了一个键入“min”的实例。将我们的朋友放在$ ... ((前面的替换请求))会导致整个表达式被其值替换,以便echo获取要打印的内容出。表达式列表的值是最后一个表达式的值,赋值的值与分配的值相同,因此echo ed的结果与最终值相同$min:小时后15分钟的最接近倍数。

    1 在shell术语中,变量实际上称为“参数”。阅读文档时要记住一些事项。

    2 由于这个原因,您实际上在命令的%M周围需要引号。 shell中的所有内容都自动为字符串;你不需要引号来使它成为一个。但是,它们不会受到伤害,并且在事物周围加上引号是一个很好的习惯,因为它可以防止代码被输入值中的意外特殊字符破坏。

答案 1 :(得分:0)

您的脚本有很多语法问题。在shell中赋值是

VAR = 'VAL'

而不是

是$ var = 'VAL'

=

周围没有空格

您的正确脚本可以是:

min=$(date +"%M")

if (( min % 15 != 0 ))
then
    echo "not fully divisible by 15"
fi

echo $min

答案 2 :(得分:0)

看起来你用其他语言转换了这个。这是一个有效的bash版本。

#!/bin/bash
min=$(date +"%M")

if [ $(($min % 15)) != 0 ] ; then
    min=$(( min - min % 1 ))
fi

echo $min;

本地输出:

~/tmp › sh ./test.sh
34

答案 3 :(得分:0)

 min=`date +"%M"`;

 if [ $min%15 != 0 ]

 then

 min=$((min - min%1))

 fi

 echo $min;