我对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"之间的空格什么事?有关其他情况下如何影响的其他信息将非常有用。
答案 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
命令所期望的。