Синтаксическая ошибка: слово неожиданно (ожидается «fi») - PullRequest
0 голосов
/ 23 октября 2018

я пытаюсь сделать скрипт:

#!/bin/bash
cat test.txt
echo "Write del if you want delete or write save if you want save"
read s1
echo "Which symbol"
read s2
if [ $s1 = "del" ]
then
sed -i "/^$s2/d"
cat test.txt
if [ $s1 = "save" ]
then
echo "saved"
else
echo "Error"
fi cat test.txt

, и у меня есть ошибка в - Синтаксическая ошибка: слово неожиданно (ожидается "fi") Помогите пожалуйста!

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Есть несколько проблем.

Сначала вы должны заменить следующие строки:

sed -i "/^$s2/d"
cat test.txt

на

sed -i "/^$s2/d" test.txt

Я думаю, вы не хотели иметь2 Если / то инструкции, но elsif, поэтому вы должны исправить свой скрипт следующим образом:

then
sed -i "/^$s2/d" test.txt
elif [ $s1 = "save" ]
then
echo "saved"

Кроме того, в качестве улучшений, я бы рекомендовал:

  • поставитьимя файла в выделенной переменной, для лучшей читаемости и удобства
  • до коснитесь файла в начале скрипта, чтобы убедиться, что он существует (даже если он пуст)

В конечном итоге скрипт будет выглядеть следующим образом:

#!/bin/bash

filePath="test.txt"

[ ! -f "$filePath" ] && echo -e "ERROR: file $filePath not found. It is required for this script to work properly" >&2 && exit 1

cat "$filePath"
echo "Write del if you want delete or write save if you want save"
read s1
echo "Which symbol"
read s2

if [ "$s1" = "del" ]; then
  sed -i "/^$s2/d" "$filePath"
elif [ "$s1" = "save" ]; then
  echo "saved"
else
  echo "Error"
fi

cat "$filePath"

Вы можете видеть, что s1 заключен в кавычки, если вы хотите избежать проблемы, если есть пробелы.

0 голосов
/ 23 октября 2018

Код отступа внутри блока или циклов if может помочь отследить подобные проблемы.Каждому if требуется fi для завершения блока.Отступы вашего кода:

#!/bin/bash
cat test.txt
echo "Write del if you want delete or write save if you want save"
read s1
echo "Which symbol"
read s2

if [ $s1 = "del" ]
then
    sed -i "/^$s2/d"
    cat test.txt

    if [ $s1 = "save" ]
    then
        echo "saved"
    else
        echo "Error"
    fi cat test.txt

Вы видите, что начальный блок не закрыт своим собственным fi.Также у вас есть чудак cat, который висит на одной линии с вашим fi.Это не должно быть там.Вместо этого что-то вроде:

#!/bin/bash
cat test.txt
echo "Write del if you want delete or write save if you want save"
read s1
echo "Which symbol"
read s2

if [ $s1 = "del" ]
then
    sed -i "/^$s2/d"
    cat test.txt

    if [ $s1 = "save" ]
    then
        echo "saved"
    else
        echo "Error"
    fi 
    cat test.txt
fi

Нет гарантии, что вы будете делать то, что хотите, но это синтаксически правильно.

Я бы ВЫСОКО предложить сбросить это в shellcheck.net, чтобы он мог указать вам правильное направление.В частности, отсутствие в ваших тестах двойных кавычек, которые могли бы вызвать странное поведение.


На основании комментария @ Аарона вы, вероятно, ищете что-то вроде следующего:

#!/bin/bash
cat test.txt
echo "Write del if you want delete or write save if you want save"
read s1
echo "Which symbol"
read s2

if [ "$s1" = "del" ]; then
    sed -i "/^$s2/d" test.txt    
elif [ "$s1" = "save" ]; then
    echo "saved"
else
    echo "Error"
fi 

cat test.txt
...