2013-06-13 3 views
0

Я пытаюсь запустить сценарий оболочки, названный graphhopper.sh в Ubuntu 12.04, который был предоставлен веб-сайтом. Когда я запускаю его, терминал производитСценарий Bash, ожидающий тогда, когда требуется другое

: not found.sh: 2: graphhopper.sh: 
graphhopper.sh: 39: graphhopper.sh: Syntax error: "else" unexpected (expecting "then") 

Строки, которые начинаются с 37 в файле оболочки,

if [ ${OSM_FILE: -4} == ".pbf" ]; then 
     wget -O $OSM_FILE $LINK 
    else  
     # make sure aborting download does not result in loading corrupt osm file 
     TMP_OSM=temp.osm 
     wget -O - $LINK | bzip2 -d > $TMP_OSM 
     mv $TMP_OSM $OSM_FILE 
    fi 

    if [ ! -f "$OSM_FILE" ]; then 
     echo "ERROR couldn't download or extract OSM file $OSM_FILE ... exiting" 
     exit 
    fi 
    else 
    echo "## using existing osm file $OSM_FILE" 
    fi 

Это весь сценарий оболочки.

#!/bin/bash 

GH_HOME=$(dirname $0) 
JAVA=$JAVA_HOME/bin/java 
if [ "x$JAVA_HOME" = "x" ]; then 
JAVA=java 
fi 

vers=`$JAVA -version 2>&1 | grep "java version" | awk '{print $3}' | tr -d \"` 
bit64=`$JAVA -version 2>&1 | grep "64-Bit"` 
if [ "x$bit64" != "x" ]; then 
    vers="$vers (64bit)" 
fi 
echo "## using java $vers from $JAVA_HOME" 

CONFIG=config.properties 
if [ ! -f "config.properties" ]; then 
    cp config-example.properties $CONFIG 
fi 

ACTION=$1 
FILE=$2 

USAGE="./graphhopper.sh import|ui|test <your-osm-file>" 
if [ "x$ACTION" = "x" ]; then 
echo -e "## action $ACTION not found. try \n$USAGE" 
fi 

function ensureOsmXml { 
    if [ ! -s "$OSM_FILE" ]; then 
    echo "File not found '$OSM_FILE'. Press ENTER to get it from: $LINK" 
    echo "Press CTRL+C if you do not have enough disc space or you don't want to download several MB." 
    read -e 

    echo "## now downloading OSM file from $LINK and extracting to $OSM_FILE" 

    if [ ${OSM_FILE: -4} == ".pbf" ]; then 
     wget -O $OSM_FILE $LINK 
    else  
     # make sure aborting download does not result in loading corrupt osm file 
     TMP_OSM=temp.osm 
     wget -O - $LINK | bzip2 -d > $TMP_OSM 
     mv $TMP_OSM $OSM_FILE 
    fi 

    if [ ! -f "$OSM_FILE" ]; then 
     echo "ERROR couldn't download or extract OSM file $OSM_FILE ... exiting" 
     exit 
# fi 
    else 
    echo "## using existing osm file $OSM_FILE" 
    fi 
} 

function ensureMaven { 
    # maven home existent? 
    if [ "x$MAVEN_HOME" = "x" ]; then 
    # not existent but probably is maven in the path? 
    MAVEN_HOME=`mvn -v | grep "Maven home" | cut -d' ' -f3` 
    if [ "x$MAVEN_HOME" = "x" ]; then 
     # try to detect previous downloaded version 
     MAVEN_HOME="$GH_HOME/maven" 
     if [ ! -f "$MAVEN_HOME/bin/mvn" ]; then 
     echo "No Maven found in the PATH. Now downloading+installing it to $MAVEN_HOME" 
     cd "$GH_HOME" 
     MVN_PACKAGE=apache-maven-3.0.5 
     wget -O maven.zip http://www.eu.apache.org/dist/maven/maven-3/3.0.5/binaries/$MVN_PACKAGE-bin.zip 
     unzip maven.zip 
     mv $MVN_PACKAGE maven 
     rm maven.zip 
     fi 
    fi 
    fi 
} 

function packageCoreJar { 
    if [ ! -f "$JAR" ]; then 
    echo "## now building graphhopper jar: $JAR" 
    echo "## using maven at $MAVEN_HOME" 
    #mvn clean 
    "$MAVEN_HOME/bin/mvn" -f "$GH_HOME/core/pom.xml" -DskipTests=true install assembly:single > /tmp/graphhopper-compile.log 
    returncode=$? 
    if [[ $returncode != 0 ]] ; then 
     echo "## compilation failed" 
     cat /tmp/graphhopper-compile.log 
     exit $returncode 
    fi  
    else 
    echo "## existing jar found $JAR" 
    fi 
} 

function prepareEclipse { 
ensureMaven 
packageCoreJar 
cp core/target/graphhopper-*-android.jar android/libs/ 
} 


## now handle actions which do not take an OSM file 
if [ "x$ACTION" = "xclean" ]; then 
rm -rf */target 
exit 

elif [ "x$ACTION" = "xeclipse" ]; then 
prepareEclipse 
exit 

elif [ "x$ACTION" = "xandroid" ]; then 
prepareEclipse 
"$MAVEN_HOME/bin/mvn" -f "$GH_HOME/android/pom.xml" install android:deploy android:run 
exit 
fi 

if [ "x$FILE" = "x" ]; then 
    echo -e "no file specified? try \n$USAGE" 
    exit 
fi 

# NAME = file without extension if any 
NAME="${FILE%.*}" 

if [ ${FILE: -4} == ".osm" ]; then 
    OSM_FILE=$FILE 
elif [ ${FILE: -4} == ".pbf" ]; then 
    OSM_FILE=$FILE 
elif [ ${FILE: -7} == ".osm.gz" ]; then 
    OSM_FILE=$FILE 
else 
    # no end default to osm 
    OSM_FILE=$NAME.osm 
fi 

GRAPH=$NAME-gh 
VERSION=`grep "<name>" -A 1 pom.xml | grep version | cut -d'>' -f2 | cut -d'<' -f1` 
JAR=core/target/graphhopper-$VERSION-jar-with-dependencies.jar 

# file without path (.osm.gz or osm.bz2 is also possible) 
TMP=$(basename "$FILE") 
TMP="${TMP%.*}" 
TMP="${TMP%.*}" 


if [ "x$TMP" = "xunterfranken" ]; then 
LINK="http://download.geofabrik.de/openstreetmap/europe/germany/bayern/unterfranken.osm.bz2" 
JAVA_OPTS="-XX:PermSize=60m -XX:MaxPermSize=60m -Xmx200m -Xms200m" 
elif [ "x$TMP" = "xgermany" ]; then 
LINK=http://download.geofabrik.de/openstreetmap/europe/germany.osm.bz2 

# Info: for import we need a more memory than for just loading it 
JAVA_OPTS="-XX:PermSize=60m -XX:MaxPermSize=60m -Xmx1600m -Xms1600m" 
else 
LINK=`echo $NAME | tr '_' '/'` 
if [ ${FILE: -4} == ".osm" ]; then 
    LINK="http://download.geofabrik.de/$LINK-latest.osm.bz2" 
else 
    LINK="http://download.geofabrik.de/$LINK-latest.osm.pbf" 
fi 
if [ "x$JAVA_OPTS" = "x" ]; then 
    JAVA_OPTS="-XX:PermSize=60m -XX:MaxPermSize=60m -Xmx1000m -Xms1000m" 
fi 
fi 



ensureOsmXml 
ensureMaven 
packageCoreJar 

echo "## now $ACTION. JAVA_OPTS=$JAVA_OPTS" 

if [ "x$ACTION" = "xui" ] || [ "x$ACTION" = "xweb" ]; then 
export MAVEN_OPTS="$MAVEN_OPTS $JAVA_OPTS" 
"$MAVEN_HOME/bin/mvn" -f "$GH_HOME/web/pom.xml" -Dgraphhopper.config=$CONFIG \ 
     -Dgraphhopper.osmreader.osm=$OSM_FILE -Djetty.reload=manual jetty:run 


elif [ "x$ACTION" = "ximport" ]; then 
"$JAVA" $JAVA_OPTS -cp "$JAR" com.graphhopper.GraphHopper printVersion=true config=$CONFIG \ 
     graph.location="$GRAPH" \ 
     osmreader.osm="$OSM_FILE" 


elif [ "x$ACTION" = "xtest" ]; then 
"$JAVA" $JAVA_OPTS -cp "$JAR" com.graphhopper.GraphHopper printVersion=true config=$CONFIG \ 
     graph.location="$GRAPH" osmreader.osm="$OSM_FILE" prepare.chShortcuts=false \ 
     graph.testIT=true 


elif [ "x$ACTION" = "xmeasurement" ]; then 
ARGS="graph.location=$GRAPH osmreader.osm=$OSM_FILE prepare.chShortcuts=fastest osmreader.acceptWay=CAR" 
echo -e "\ncreate graph via $ARGS, $JAR" 
START=$(date +%s) 
"$JAVA" $JAVA_OPTS -cp "$JAR" com.graphhopper.GraphHopper $ARGS prepare.doPrepare=false 
END=$(date +%s) 
IMPORT_TIME=$(($END - $START))000 

function startMeasurement { 
    COUNT=5000 
    ARGS="$ARGS prepare.doPrepare=true measurement.count=$COUNT measurement.location=$M_FILE_NAME graph.importTime=$IMPORT_TIME" 
    echo -e "\nperform measurement via $ARGS, $JAR" 
    "$JAVA" $JAVA_OPTS -cp "$JAR" com.graphhopper.util.Measurement $ARGS 
} 

# use all <last_commits> versions starting from HEAD 
last_commits=$3 

if [ "x$last_commits" = "x" ]; then 
    # use current version 
    "$MAVEN_HOME/bin/mvn" -f "$GH_HOME/core/pom.xml" -DskipTests clean install assembly:single 
    startMeasurement 
    exit 
fi 

commits=$(git rev-list HEAD -n $last_commits) 
for commit in $commits; do 
    git checkout $commit -q 
    M_FILE_NAME=`git log -n 1 --pretty=oneline | grep -o "\ .*" | tr " ,;" "_"` 
    M_FILE_NAME="measurement$M_FILE_NAME.properties" 
    echo -e "\nusing commit $commit and $M_FILE_NAME" 

    "$MAVEN_HOME/bin/mvn" -f "$GH_HOME/core/pom.xml" -DskipTests clean install assembly:single 
    startMeasurement 
done 

fi 
+2

Это первое сообщение об ошибке выглядит так, что что-то имеет конец строки в стиле DOS (т. Е. Возврат каретки, за которым следует linefeed, а не только перевод строки). Попробуйте распечатать сценарий с помощью 'cat -v graphhopper.sh' и найдите«^M »в конце строк. –

+0

Да, есть много^Ms. Что я могу сделать сейчас? – MWH

+1

Возможный дубликат [Найти и удалить окончания строки DOS на Ubuntu] (http://stackoverflow.com/questions/12508923/find-and-remove-dos-line-endings-on-ubuntu) – chepner

ответ

1

[Расшифровано из моего комментария ...] Файл сценария, по-видимому, имеет концевые строки в стиле DOS (т. Е. Возврат каретки, за которым следует линия перевода строки, а не только строка). Это сильно смущает оболочку, так как она видит возврат каретки как часть команды. Поддавки является то, что первое сообщение об ошибке:

: not found.sh: 2: graphhopper.sh: 

Что произошло на самом деле это напечатали сообщения об ошибке «graphhopper.sh: 2: graphhopper.sh:^M: не найден» (где^М является фактически каретка вернуть); когда терминал видит^M, он возвращается к началу строки и печатает конец сообщения об ошибке поверх начала.

Один из других эффектов, который это имеет, заключается в том, что оболочка не может распознавать ключевые слова в конце строк. Когда он видит строку:

if [ ${OSM_FILE: -4} == ".pbf" ]; then^M 

... он думает, что then^M регулярная команда, а не конец условия части команды if, поэтому он держит ищет then. Но команда else кажется, есть некоторые пробелы в конце:

else ^M 

... что означает, что оболочка делает признать else ключевое слово и получить очень смущены о том, что он делает в середине состояния части if.

Так что вы можете сделать? Для этого почти наверняка есть команда; Я привык к dos2unix, но, видимо, у ubuntu этого нет, вместо этого пакет «tofrodos» включает в себя команду fromdos (см. here). Или, вы можете сделать это с Perl:

perl -pi -e 's/\r//g' graphhopper.sh 

Ваш текстовый редактор может также быть в состоянии сохранить в UNIX (а не DOS) формате. Говоря об этом, вы должны либо переключить текстовый редактор в режим unix, либо найти другой текстовый редактор для сценариев.

+0

Wow Большое спасибо. Это была проблема. Легко исправляется с помощью команды fromdos. – MWH

1

Удалить дополнительный fi:

if [ ! -f "$OSM_FILE" ]; then 
     echo "ERROR couldn't download or extract OSM file $OSM_FILE ... exiting" 
     exit 
    # fi 
    else 
     echo "## using existing osm file $OSM_FILE" 
    fi 
+0

Не работает. Все равно такое же сообщение об ошибке. – MWH

+0

Ваш сокращенный пример не иллюстрирует проблему. Включите весь сценарий. –

+0

Я изменил свое оригинальное сообщение, чтобы включить весь скрипт @Brian. Пожалуйста, посмотри на это. – MWH

0

Переменная OSM_FILE не установлен ни к чему. Это заставляет его расширяться до пустой строки, что заставляет оболочку думать, что в условиях if есть синтаксические ошибки.

Распечатайте значение OSM_FILE перед использованием, а если оно пустое, отлаживайте назад.

+0

Да. Значение OSM_FILE устанавливается на запуск. Мне нужно передать значение этому, когда я запускаю сценарий оболочки как «./graphhopper import new-York.osm» – MWH

+0

Право. Но подтвердили ли вы это. Вставив инструкцию echo в свой скрипт прямо вокруг области, где у вас возникла проблема. Кроме того, вам нужно вернуть обратно в «fi», кто-то попросил вас прокомментировать. – Ziffusion

+0

Я мало знаю о сценариях оболочки. Пожалуйста, скажите мне, где именно я должен иметь эхо-заявление и проверить? – MWH

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

  • Нет связанных вопросов^_^