#bash #unix #centos7 #slurm
#bash #unix #centos7 #slurm
Вопрос:
Я пытаюсь запустить эту программу bash на компьютере Centos7. Я пробовал много разных способов, но все время получаю эту ошибку:
line 31: syntax error near unexpected token `done' line 31: `done'
Строка 31 принадлежит первой done
.
Я cat -v mybash.bash
проверил наличие странных токенов, и их нет.
Мой сценарий выглядит следующим образом:
for mainFolder in *
do
if [ -d "${mainFolder}" ]
then
cd "${mainFolder}" || exit
echo "Entering in directory ${mainFolder}"
cp ../mypy.py .
chmod x mypy.py
./mypy.py
echo "Executing mypy.py"
sleep 1
for subFolder in *
do
if [ -d "${subFolder}" ]
then
cd "${subFolder}" || exit
echo "Entering in directory $subFolder in $mainFolder"
echo "Submitting slurm file in current directory"
sbatch *.slurm
sleep 1
fi
cd ..
done
fi
cd ..
done
Пожалуйста, помогите мне заметить, что я делаю неправильно.
Комментарии:
1. Я не могу воспроизвести эту ошибку. Ваши
if
утверждения неверны, вам нужны пробелы вокруг[
и]
. И вы должны заключать все свои переменные в кавычки, если они содержат пробелы.2. Вставьте свой скрипт в shellcheck. сеть, чтобы увидеть все другие проблемы.
3. Какая строка является строкой 31? Вы опубликовали только 27 строк. Есть ли еще что-то, что вы не показали?
4. да. Изначально это файл отправки slurm. Я не c / p части #SBATCH.
5.Вам нужно поместить последний
cd ..
внутри оператора if.
Ответ №1:
Я предполагаю, что скрипта отправки slurm там нет. Следующее проверяет, что найден один и не более одного сценария.
Я также переместил cd ..
, чтобы это происходило только после cd
.
for mainFolder in *
do
if [ -d "${mainFolder}" ]
then
echo "Entering in directory ${mainFolder}"
cd "${mainFolder}" || exit
cp ../mypy.py .
chmod x mypy.py
echo "Executing mypy.py"
./mypy.py
sleep 1
for subFolder in *
do
if [ -d "${subFolder}" ]
then
cd "${subFolder}" || exit
echo "Entering in directory $subFolder in $mainFolder"
scripts=$(ls *.slurm)
nScripts=$(echo $scripts | wc -w)
if [ $nScripts == 1 ]
then
echo "Submitting $scripts"
sbatch $scripts
elif [ $nScripts == 0 ]
then
echo "Error: No script found"
else
echo "Error: $nScripts scripts found (${scripts})"
fi
sleep 1
cd ..
fi
done
cd ..
fi
done