Shell Scripts中出现间距和语法错误的原因是什么?

时间:2015-04-01 14:02:25

标签: shell

我对Windows上的批处理脚本非常熟悉和熟悉。 我刚刚开始使用UNIX,而且我很难掌握正确的间距。

下面的脚本运行正常。我们称之为 script1.sh

!#/bin/sh
now=$(date +"%s")
echo "This file was created on $now"

下面粘贴的这个脚本会引发错误,我也在下面粘贴了

!#/bin/sh
now=$(date + "%s")
echo "This file was created on $now"
[root@localhost /]# sh postbackup.sh
postbackup.sh: line 1: !#/bin/sh: No such file or directory
date: extra operand `%s'
Try `date --help' for more information.
This file was created on

为什么+和"%s"之间的空格什么事?有关其他情况下如何影响的其他信息将非常有用。

2 个答案:

答案 0 :(得分:1)

您的脚本中有2个错误:


  

postbackup.sh:第1行:!#/ bin / sh:没有这样的文件或目录

这是因为您应该使用!#(错误)而不是#!(正确),并且它会尝试运行不存在的!#/bin/sh命令。 /> 这个错误在其他方面是相当无害的并且它“有效”,因为您使用sh明确地调用sh postbackup.sh,但它仍然是错误,您应该修复它。


  

日期:额外的操作数`%s'

这也不适用于命令行,date需要一个以+开头的参数,然后为您提供一种格式(在这种情况下为%s),添加一个空格使两个参数,而date不知道%s属于+

正如我所说,如果你在命令行输入它也会失败:

$ date + %s  
date: extra operand ‘%s’

所以你需要做的是将它作为一个参数,可以通过添加引号或使用\转义空格来完成:

$ date '+ %s'
 1427897164
$ date +\ %s
 1427897164

请注意,输出现在以空格开头!这是预期的,因为你给了date空格。

据我所知,没有办法阻止这个领先的空间,除了以后删除它......我建议你不要在这里使用空格; - )

答案 1 :(得分:1)

shell脚本的第一行格式为:

#!/path/to/shell

这里的符号很重要。它以#开头,因为该字符通常用于在脚本中表示注释。例如:

#!/bin/sh

# This is a comment about the following line, which prints a greeting.
echo "Hello."

评论代码通常是一个好主意,特别是当事情变得更大,更复杂时。

这个重要的原因是,如果您运行,例如sh script1.sh,并且脚本以注释开头,则注释不会生成错误。但是,如果脚本的第一行是带有感叹号的注释,则会出现一种特殊情况。这种符号被称为" shell magic"或" shebang" (或者也许还有一些其他名称),shell使用它来确定用于文件其余部分的解释器。例如,您可以使用awk:

#!/usr/bin/awk -f

BEGIN { print "This is an awk script."; }

通过使用注释字符启动shebang,当脚本作为shell的参数运行时(例如,sh script1.sh),可以避免错误。

现在你知道为什么你有这个错误。

" date"的问题是它的用法想要一个"字符串"作为参数,shell将使用空格来分隔参数。我通常通过确保将前导+放在带引号的字符串中来解决这个问题:

$ date '+%Y-%m-%d'

请注意,此格式字符串通常是提供给date命令的 last 参数。其他参数取决于您所使用的操作系统。例如,如果您想在Linux中使用历元秒的日期,则可以使用:

$ date -d @1420898113 '+%Y-%m-%d'

请注意,空格也在此处分隔参数。如果你在+和格式字符串之间放一个空格,当然没有引号),你可以把它变成两个参数,这不是date命令所期望的。