Есть несколько проблем, с кодом, показанным на вопрос:
if [ -d D.* ]
then
if [-f *.java ]
then echo "java file is here"
else echo "java file does not exist"
exit
fi
echo "file is here"
else
echo "no .java file(s) submitted"
exit
fi
Я сократил количество строк в коде, не влияя на то, как оно работает, и систематически отступы.
Первая проблема заключается в строке:
if [ -d D.* ]
Если есть более чем один каталог (или файл), который соответствует D.*
, вы будете иметь синтаксический неправильный вызов тестовой команды (он же [
). Вы, наверное, нужно что-то подобное:
for dir in D.*
do
if [ -d "$dir" ]
then …
fi
done
Следующая проблема заключается в следующем:
if [-f *.java ]
Во-первых, большинство систем не имеют команды [-f
установлен. [
- имя команды; на вашем компьютере часто есть файл /bin/[
(или /usr/bin/[
), хотя он также является встроенной оболочкой. Но важно то, что [
- это имя команды. Вам нужно пространство после [
и перед первым оператором. Остальная часть линии сталкивается с той же проблемой, что и линия [ -d D.* ]
.
Вам также необходимо понять, что ваш тест для файлов Java ищет файлы в текущем каталоге; просто проверка того, что D.*
является каталогом, не заставит этот код искать файлы в этом каталоге.
Таким образом, вполне вероятно, что вы хотите код больше похож:
for dir in D.*
do
if [ -d "$dir" ]
then
for file in "$dir"/*.java
do
if [ -f "$file" ]
then …
else …
fi
done
else
…
fi
done
Существуют различные вопросы, вы можете все еще хотеть рассмотреть, например, с помощью shopt -s nullglob
, так что, если нет каталогов, которые не соответствуют D.*
или нет файлы, которые соответствуют "$dir"/*.java
, вы получаете пустой список имен для обработки.
Однако вам предстоит пройти долгий путь по пути создания сценария.
Если я не понимаю вопрос (что нелегко понять), ваш код не имеет никакого отношения к вопросу, который вы задаете? – Carpetsmoker
Пожалуйста, перепишите свой вопрос. Я почти не понимаю. – icedwater
hey no really new to shell – Heyyyy