【问题标题】:crontab shell script starts another script: remove char errorcrontab shell 脚本启动另一个脚本:删除字符错误
【发布时间】:2023-04-03 03:11:01
【问题描述】:

我想通过 crontab 运行一个 shell 脚本,该脚本执行某些操作,然后运行另一个 shell 脚本,该脚本检查某个文件夹中的某些文件并为每个文件创建一个目录。 第一个脚本“my_crontab.sh”如下所示:

#!/bin/bash
cd /home/myusername/myfolder
python mypythonscript.py
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/myusername/myfolder
bash start.sh

Crontab 执行“my_crontab.sh”并且“start.sh”也被调用(我从 crontab 日志文件中知道)

这就是“start.sh”的样子:

#!/bin/bash
echo "start.sh started"
if [ $(find -maxdepth 1 -type f | wc -l) -ne 0 ]; 
then
 for i in *.jpg
 do
  folder="${i/.jpg/}"
  mkdir ../folders/$folder
 done
else
 echo "nothing to do"
fi

现在我收到错误: /bin/sh: 7: /home/myusername/myfolder/start.sh: Bad substitution

我已经尝试过folder=${ i:0:-4 },但这也不起作用。 任何想法如何解决它?

【问题讨论】:

  • 您的脚本使用sh 运行,并且不支持${i/.jpg/} 之类的bash 代码(sh 之于bash 就像C 之于C++)。您应该将my_crontab.sh 更新为#!/bin/bash。更新 start.sh 是不够的。除了 David C. Rankin 提到的间距问题之外,还要修复此问题

标签: linux bash shell crontab


【解决方案1】:

从评论继续,您在start.sh 中的Bad Substitution 是因为您将spaces 留在7braces 和您的变量名称和替换之间,(例如"${ i/.jpg/ }" 应该是@ 987654327@。4 行有问题,因为-ne 期望两边都有整数表达式,并且不能保证命令替换将符合(它应该与wc -l),但不能保证。你最好写@987654331 @类似的东西:

#!/bin/bash

echo "start.sh started"
declare -i cnt=0;

while read -r fname
do
    folder="${fname%.jpg}"
    mkdir -p "../folders/$folder"
    ((cnt++))
done < <(find . -maxdepth 1 -type f -name "*.jpg")

[ "$cnt" -eq '0' ] && echo "nothing to do"

注意:计数器cnt仅用于在没有找到.jpg文件的情况下输出"nothing to do",如果不需要,只需删除所有引用的行cnt.

【讨论】:

    【解决方案2】:

    啊完美。非常感谢!

    它还有助于使用bash start.sh 而不是. start.sh

    我在我的问题中更新了上面的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      • 2022-08-22
      • 2013-11-25
      • 2017-04-15
      • 1970-01-01
      • 2012-01-11
      相关资源
      最近更新 更多