我想通过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"one_answers"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
是由于您将spaces
留在braces
和您的变量名称和替换之间的7
行,(例如"${ 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
也很有帮助。
我在问题中更新了上面的代码