【问题标题】:Unix shell script error in crontabcrontab 中的 Unix shell 脚本错误
【发布时间】:2017-12-04 22:23:32
【问题描述】:

我正在尝试安排我的 shell 脚本,但是当它触发处理计划任务时,会出现此错误提示。但是当没有文件被处理时,它只会显示 echo 命令。

这是我的代码:

if [ "$(ls -A $path)" ]
    then
    for file_name in "$path"/*; do
        filebasename=$(basename "$file_name")


        prefix=${filebasename:0:4};

        if [ "$prefix" == "abcd" ] ; then

            mv  "$file_name" "$out"

        fi                          

    done


    else echo "No files available at $path"
fi

这是错误:

SH:prefix=${filebasename:0:4}:0403-011 The specified substitution is not valid for this command

【问题讨论】:

  • ${var:n:m} 扩展在 /bin/sh 中不可用。您需要为此指定 ksh 或 bash。与== 运算符相同。
  • 嗨格伦谢谢你,但我该怎么办?我需要重构代码的语法吗?
  • 您可以在脚本的第一行添加#!/bin/bash
  • 您还有其他一些语法错误。将您的代码粘贴到 shellcheck.net 以获取更多提示
  • 感谢@glennjackman

标签: bash shell unix cron


【解决方案1】:

您可以通过这种方式更简单地编写代码:

#!/bin/bash

count=0
if [[ -d "$path" ]]; then
  for file_name in "$path"/abcd*; do
    [[ -f "$file_name" ]] && { ((count++)); mv "$file_name" "$out"; }
  done
fi

if ((count == 0)); then
  echo "No files available at $path"
fi

优点:

  • 无需解析ls的输出
  • 无需为每个文件做basename + substring
  • 跳过名称以abcd 开头的所有目录

如果你不想知道是否有匹配的文件,整个事情可以写在一行中:

find "$path" -name "abcd*" -type f -exec mv "{}" "$out" \;

【讨论】:

  • 值得一提的是,最后一个建议使用find,可以在任何shell 中工作,并且不需要bash。哦,cd 是多余的(除非 $out 相对于 $path)。
  • 谢谢@ghoti。我必须输入 cd,因为如果没有它,find 在我的 Mac 上将无法工作。
  • 这听起来很奇怪。 macOS 中的 find 应该与其他任何地方的工作方式大致相同。你的命令到底是什么,你得到了什么错误?你的$out实际上是相对的吗?可能想了解-execdir。有关您的答案的更多信息..您可以使用shopt -s nullglob 避免[[ -f ...(是的,即使在bash 3 中也是如此)。您可能还想包含 find 的 -maxdepth 选项,以模拟没有 globstar 的 bash for 循环的行为。
  • 该命令取决于变量的值。你没有提到你测试过的$path$out 的值。
  • 在 macOS 上,只有 /tmp$path 可能不起作用,因为这是指向 /private/tmp 的符号链接。如果您设置path="/tmp/"(斜杠),它应该跟随符号链接,而不是将其作为文件进行评估。或者,您可以为find 使用-H-L 选项。
【解决方案2】:

我使用以下代码: 前缀=$(echo ${filebasename} | cut -c1-4)

而不是前缀=${filebasename:0:4};

现在它完全在我的 cronjob 中运行,并且没有如前所述的错误。谢谢你们的帮助! :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 2019-11-14
    • 2015-06-30
    相关资源
    最近更新 更多