crontab shell 脚本启动另一个脚本:删除字符错误

crontab shell script starts another script: remove char error

我想 运行 一个 shell 脚本通过 crontab 做一些事情,然后 运行 另一个 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 },但这也不起作用。 有什么解决办法吗?

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

#!/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.

的行

啊完美。非常感谢!

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

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