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
。
我更新了上面问题中的代码。
我想 运行 一个 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
。
我更新了上面问题中的代码。