I want to run a shell script through crontab which does something and then runs another shell script which checks a certain folder for certain files and creates a directory for each file. The first script “my_crontab.sh” looks like this:
#!/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 executes “my_crontab.sh” and “start.sh” gets also called (I know from the crontab log file)
This is what “start.sh” looks like:
#!/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
now I’m getting the error:
/bin/sh: 7: /home/myusername/myfolder/start.sh: Bad substitution
I already tried folder=${ i:0:-4 }
instead, but that’s also not working.
Any ideas how to fix it?
Advertisement
Answer
Continuing from the comment, your Bad Substitution
in start.sh
is caused because you are leaving spaces
in line 7
between the braces
and your variable name and substitution, (e.g. "${ i/.jpg/ }"
should be "${i/.jpg/}"
. Line 4
is problematic because -ne
expects integer expressions on both sides and there is no guarantee the command substitution will comply (it should with wc -l
) but it is not guaranteed. You are better served writing start.sh
something similar to:
#!/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"
note: the counter cnt
is just used to output "nothing to do"
in the event there are no .jpg
files found, if that isn’t needed, just delete all lines referring to cnt
.