【问题标题】:bash: syntax error near unexpected token `|'bash:意外标记'|'附近的语法错误
【发布时间】:2015-12-11 13:27:52
【问题描述】:

此命令在命令提示符下运行良好:

 ]$ ls -ltr ../cmxserver.log*|grep "`date | awk '{print $2" "$3}'`"|cut -d "/" -f2
 cmxserver.log.2
 cmxserver.log.1
 cmxserver.log

但是,在 for 循环中使用 this 会产生错误 bash: syntax error near unexpected token `|'

   ]$for y in `ls -ltr ../cmxserver.log*|grep "`date | awk '{print $2" "$3}'`"|cut -d "/" -f2`

 -bash: syntax error near unexpected token `|'

有什么想法吗?

谢谢

【问题讨论】:

  • 不确定你想用你的命令做什么——你能解释一下吗?看起来可以简化很多。一般来说,解析ls是要避免的。
  • 第 1 步:将弃用的刻度(不能嵌套)替换为可以嵌套的 $(...)
  • @EdMorton 是的,他们没有逃脱内部反引号,所以命令被破坏了。最好只使用$(),它可以轻松嵌套。
  • 如果您指定日期命令的格式,您可能可以完全跳过 awk

标签: linux bash shell awk


【解决方案1】:

整行可以通过find命令解决:

find .. -maxdepth 1 -mtime -1 -daystart -name 'cmxserver.log*' -printf "%f\n"
  • .. - 搜索目录
  • -maxdepth 1 - 不要递归到子目录
  • -mtime -1 - 只有今天的文件
  • -daystart - 计算自午夜以来的日期,而不是持续 24 小时
  • -name 'cmxserver.log*' - 文件名
  • -printf "%f\n" - 仅打印基本名称

【讨论】:

  • 值得一提的是,-printffind 的 GNU 扩展,所以这并不适用于任何地方。
  • 感谢 Tom 的回复,但它会导致文件的时间少于 24 小时。不一定是在同一天中午 12:00 之后创建的?
  • 是的,你是对的,它是 24 小时周期。它可以通过添加 -daystart 参数来修复。我正在修正答案。
  • 感谢 Mitroo,但 -daystart 似乎仍然有任何区别,因为它显示超过 24 小时的文件。
【解决方案2】:

您在输入时可能理解了您的意思:

for y in `ls -ltr ../cmxserver.log*|grep "`date | awk '{print $2" "$3}'`"|cut -d "/" -f2`

但是您已经设法完全混淆了 bash。 Bash(和其他 shell)不会嵌套反引号(`),除非内部反斜杠被反斜杠。如所写,第二个反引号被认为关闭了第一个,导致命令ls -ltr ../cmxserver.log*|grep "。由于您没有在 date 之前放置空格,因此单词 date 被解析为单词的一部分,包括命令替换。同样,单引号 '{print $2"$3}' 被解析为添加到反引号命令 "|cut -d "/" -f2 之前。

当然,这两个反引号命令都是语法错误,因为它们包含未闭合的双引号,但在 bash 到达解析和执行命令的点之前,它会留下一些大致看起来像这样的东西:

for y in word1 | awk word2

这是一个语法错误,因为管道符号只能出现在完整的命令之间,而for y in word1 不是完整的命令。

反引号已弃用。停止使用它们。

如果你写过:

   for y in $(ls -ltr ../cmxserver.log* |
              grep "$(date | awk '{print $2" "$3}')" |
              cut -d "/" -f2)

bash 和人类读者都会发现该表达式更容易解析,并且 bash 会按照您的预期解析它。

话虽如此,尝试解析ls输出的是never a good idea,而永远不需要解析date输出,因为你可以specify a format字符串;在这种情况下,您可以使用date +"%b %d" 来获取月份和日期。 (第一个链接由 Charles Duffy 评论提供。)

【讨论】:

    猜你喜欢
    • 2014-02-26
    • 2018-12-18
    • 2014-01-20
    • 2021-07-29
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多