2014-12-12 2 views
-1

что с этим кодом? Он прыгает в Java-файл, который не существует, так как есть .java файл в D.usseridКод не работает должным образом, ищет советы

#!/bin/bash 

if [ -d D.* ] 
then 

    if [-f *.java ] 
     #check the author name in java file 
     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 
+1

Если я не понимаю вопрос (что нелегко понять), ваш код не имеет никакого отношения к вопросу, который вы задаете? – Carpetsmoker

+0

Пожалуйста, перепишите свой вопрос. Я почти не понимаю. – icedwater

+0

hey no really new to shell – Heyyyy

ответ

2

Есть несколько проблем, с кодом, показанным на вопрос:

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, вы получаете пустой список имен для обработки.

Однако вам предстоит пройти долгий путь по пути создания сценария.

+0

Большое вам спасибо, это помогает много – Heyyyy

+0

для dir в D. * do if [-d "$ dir"] , затем для файла в «$ dir»/*.Java делать если [-f "$ файл"] затем \t \t #echo "файл Java здесь" \t \t Grep '@author' $ файл | вырезать -c12- \t \t еще \t \t эхо «нет .java файла (ов) представил» фи сделано еще \t эхо «каталог не существует» фи сделано это мой код, я должен put if условие, чтобы проверить, нет ли имени автора какого-либо предложения? – Heyyyy

+0

Это зависит от того, что вы хотите. Вы хотите видеть информацию об авторе или просто знать, присутствует ли она? 'if grep author '$ file"; затем: OK - информация об авторе присутствует; else echo "Нет информации об авторе в $ файле"; fi', в котором будет отображаться информация автора, если она присутствует. Если вы хотите скрыть его, добавьте '>/dev/null' перед первой точкой с запятой или' -s' в качестве опции после 'grep' или' -q' в качестве опции после 'grep'. –

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