我正在尝试执行一个非常简单的程序(将数字舍入到可被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
我在这里遇到了什么问题?
答案 0 :(得分:2)
该脚本无效bash语法。我首先会找到一些有用的例子,也许还有整个教程。你可以从William Shotts的书开始,这是available online。
有关您尝试的一些注意事项:
$
用于请求用其值替换变量 1 。它不是变量名称的一部分,因为它在Perl或PHP中。因此,它不会在作业的左侧使用。
shell主要用于运行其他可执行文件,并通过该镜头解释所有内容。如果命令行看起来像是对另一个程序的调用,那么shell将尝试运行该其他程序,而不是执行任何shell-scripty。因此,命令min = date +"%M"
将使shell查找名为min
的程序,并使用三个命令行参数执行它:=
,date
和{{1 }}。
为了使作业得到承认,+%M
周围不能有任何空间。
但是,如果没有空格,=
仍然不对。 shell将暂时将文字字符串“date”分配给变量min=date +"%M"
,然后尝试运行名为min
的命令。
如果值中包含空格,则需要在其周围加上引号 2 。
但即使使用引号,+%M
也会将min="date +%M"
文字字符串“date +%M”分配给min
。如果您确实希望运行命令 date +"%M"
并将其输出用作值,则必须使用命令替换语法$(...)
来请求。在这里,我们的朋友美元符号再次请求动态值替换,但括号使其成为不同类型的请求;而不是变量的值,表达式将被命令的输出替换。
由于上面提到的解析问题,内置算术运算仅适用于某些上下文。创建有效算术上下文的两种方法是((
... ))
特殊形式和let
命令。
最后,即使你的脚本在语法上是有效的,如果你的目标是向下舍入到最接近的15的倍数,那么它在语义上是不正确的。除以1之后的余数总是为零,所以你的脚本以尝试结束要从min
中减去0 - 并且无论如何都不会对结果做任何处理,因为没有赋值回min
。如果要向下舍入,则必须实际减去刚刚测试的余数。你可以这样做:
min=$(date +%M)
let rem=min%15
if (( rem != 0 )); then
let min-=rem
fi
echo $min
但你也可以更简洁地做到这一点:
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;