【问题标题】:ksh script syntax error on date日期上的 ksh 脚本语法错误
【发布时间】:2017-09-12 09:18:57
【问题描述】:

我的 shell 脚本在这部分失败了

dt=$(date +%Y%m%d)

syntax error at line 35: `dt=$' unexpected

这有点奇怪,因为我使用它来获取日期时间并且没有任何问题

timestamp=$(date +%Y%m%d%H%M%S)

20170911105251

我已经在 Notepad++ 中检查过,我没有下面@Frank 建议的任何脏字符

以下是我的示例脚本。请注意,我省略了一些保密的部分。基本上,脚本根据指定的 dt 将文件从服务器 A 传输到 B。如果执行过程中没有指定日期参数,则取当前日期。

if [ -z "$1" ]
then
    dt=$(date +%Y%m%d)
else
    dt=$1
fi

export rundate

timestamp=$(date +%Y%m%d%H%M%S)
logfile=${log_path}/${batch}-${dt}-${timestamp}.log
mail_file=${log_path}/${batch}-mail-${timestamp}.txt

export mail_file

filecount=$(wc -l ${batch_filelist} | cut -d " " -f 1)

sftp ${dest} <<EOF >> $logfile
cd $destdir
lcd $sourcedir
put -p *.txt
exit
EOF


mail -s "SFTP Done (dt:$dt)" $(cat $email_accounts) < $mail_file

【问题讨论】:

  • 我从您的屏幕截图中看到您正在尝试运行名为dt:dt=$(dt ... 的命令——但这并不能解释错误消息。你确定要显示第 35 行吗?
  • @glennjackman - 最初的帖子只包含我脚本的一部分。为了清楚起见,我已经包含了整个内容。
  • 我已经用一个工作示例编辑了我的答案
  • 仍然,您正在尝试调用命令dt
  • 在问题的开头,您声明dt=$(date +%Y%m%d) 造成问题...注意对日期的引用;但是这段代码在您的完整脚本中不存在;在您的完整脚本中,您有 dt=$(dt +%Y%m%d) ... 注意对 dt 而不是 date 的引用;除非dt(右侧)是用户定义的别名/功能/脚本,否则会导致错误(例如,dt 是无效命令);考虑将此命令更改为dt=$(date ...)

标签: unix ksh


【解决方案1】:

小心,当您从任何地方复制文本并粘贴到文件中时(我认为您做到了),它可能会添加“脏”字符。 如果您有像 notepad++ 这样的文本编辑器,请点击:

它将显示所有字符。

通过notepad++,你可以将文件格式从windows改为unix,在页面右下角右击:

保存文件并再次发送到您的机器。 语法似乎正确,所以它应该可以工作。

无论如何我都提到了notepad++,但你可以使用其他文本编辑器来做到这一点。

dt=$(date +'%Y%m%d')不是 dt=$(dt +'%Y%m%d')

下面的工作示例:

!/usr/bin/bash
if [ -z $1 ]
then
    dt=$(date +'%Y%m%d')
else
    dt=$1
fi
echo $dt

结果:

xxxxxxxxxxxxxx:/pathtosh> prova.sh

20170911

xxxxxxxxxxxxxx:/pathtosh> prova.sh 1

1

【讨论】:

  • 感谢您的建议。我实际上已经检查过了,并且没有脏字符(一定是我在上面撰写问题时发生的。)
  • 在我更改原始脚本中的变量名称时更正了我的帖子。我的理解是否正确,我应该将 %Y%m%d 放在单引号中?这也适用于时间戳变量吗?
  • 它也可以在没有单引号的情况下工作,你的问题超出了语法
  • 我已将我的语法修改为旧版本,即 dt=date +%Y%m%d,终于可以使用了。我的客户服务器的行为真的很奇怪。
  • 如果答案对你有用,如果你接受会很友善:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 2013-12-09
  • 2016-06-26
  • 1970-01-01
相关资源
最近更新 更多