2015-07-23 5 views
-1

Обучение bash скриптов в Linux на VirtualBox.Bash while loop `done 'синтаксическая ошибка неожиданный токен

Я пишу сценарий, который использует цикл while, чтобы спросить, в каком текстовом файле писать, если вы решите не перезаписывать существующий файл, между прочим.

Вот мой код:

#!/bin/bash 

bool="true" 
counter="true" 
while [ "${bool}" == "true" ] ; do 
    bool="false" 
    if [ "${counter}" == "true" ] ; then 
    if [ $# -eq 1 ] ; then 
     ff=$1 
    fi 
    else 
    read -p "Enter the .txt file you would like to write to: " ff 
    fi 

    txt=".txt" 
    if [[ $ff != *$txt* ]] ; then 
    echo $ff 
    ff="$ff$txt" 
    echo $ff 
    fi 

    if [ -w $ff ] ; then 
    var="true" 
    while [ "${var}" == "true" ] ; do 
     var="false" 
     read -p "${ff} already exists. Do you want to overwrite it? y/n: " yorn 
     if [ $yorn == "y" ] ; then 
     echo "'$ff' is being overwitten" 
     elif [ $yorn == "n" ] ; then 
     echo "Let's try this again..." 
     bool="true"  
     else 
     echo "You entered a command other than y or n." 
     var="true" 
     fi 
    done 
    else 
    echo "'$ff' has been created" 
    fi 

    counter="false" 
done 

echo "Writing to ${ff}..." 
echo "${ff}" > $ff 
echo "" >> $ff 

declare -a alphabet=("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z") 
echo ${alphabet[@]} 
letters=${#alphabet[@]} 
echo "There are ${letters} letters in the alphabet" 
loops=$((letters*letters*letters)) 
echo "The script loops ${loops} times" 

start=$(date +%s.%N) 
for x in "${alphabet[@]}" 
do 
    x=$x$x 
    for y in "${alphabet[@]}" 
    do 
    y=$y$y 
    for z in "${alphabet[@]}" 
    do 
     z=$z$z 
     xyz=$x$y$z 
     grep $xyz /usr/share/dict/words >> $ff 
    done 
    done 
done 
end=$(date +%s.%N) 
elapsed=$(echo "$end - $start" | bc -l) 
echo "The search took ${elapsed} seconds." 

sleep 10s 
emacs $ff 

exit 0 

Вот моя ошибка за сделанное из цикла в то время как:

[email protected]:~/scripts$ ./script.sh abc 
./script.sh: line 35: syntax error near unexpected token `done' 
./script.sh: line 35: `done' 

Что вопрос здесь?

+1

Попробуйте [shellcheck] (http://www.shellcheck.net) –

+1

- это ваш отступ, как это, в вашем реальном файле? Есть несколько блоков, которые было бы легче читать, если бы они были отступом. –

+1

вам не хватает ** fi ** после эха "'$ ff' был создан" fi – Mircea

ответ

1

У вас есть две проблемы:

1) Вам нужно место здесь. Как общее предложение, лучше использовать встроенную оболочку [[ ... ]] по тесту [ ... ] в bash.

if [ "${counter}" == "true" ] ; then 
         ^

2) Вы не закрываете if с «fi» здесь.

elif [ $yorn == "n" ] ; then 
     echo "Let's try this again..." 
     bool=true 
    fi # <--- Closing "fi" here 

Если вы отступаете от кода, вы можете легко обнаружить такие ошибки быстрее.

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