2016-06-23 5 views
0

Я хочу запустить сценарий оболочки через crontab, который что-то делает, а затем запускает другой скрипт оболочки, который проверяет определенную папку для определенных файлов и создает каталог для каждого файла. Первый сценарий "my_crontab.sh" выглядит следующим образом:скрипт оболочки crontab запускает другой скрипт: удалить ошибку char

#!/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" получает также называется (я знаю из файла журнала кронтаб)

Этот это то, что "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

Я уже три ed folder=${ i:0:-4 }, но это тоже не работает. Любые идеи, как это исправить?

+0

Ваш скрипт работает с 'sh' и не поддерживает код bash, такой как' $ {i/.jpg /} '(' sh' означает 'bash', что C является C++). Вы должны обновить 'my_crontab.sh', чтобы иметь' #!/Bin/bash'. Обновление 'start.sh' недостаточно. Исправьте это в дополнение к проблеме расстояния, упомянутой Дэвидом К. Рэнкином –

ответ

0

Продолжая комментарий, ваш Bad Substitution в start.sh вызвана тем, что вы уезжаете spaces в соответствии 7 между вашим именем переменной и подстановки braces и, (например, "${ 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 просто используется для вывода "nothing to do", если нет .jpg Найдено файлов, если не нужно, просто удалите все строки, ссылающиеся на cnt.

0

ah perfect. большое спасибо!

это также помогло использовать bash start.sh вместо . start.sh.

Я обновил код выше в своем вопросе.

Смежные вопросы