首页 > 解决方案 > 语法错误:单词意外(期待“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”)请帮助!

标签: bashshellcommand-linescriptingsh

解决方案


在块或循环内缩进代码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 中,这样它就可以为您指明正确的方向。特别是在您的测试中缺少双引号可能会导致一些奇怪的行为。


根据@Aaron 的评论,您可能正在寻找类似以下内容:

#!/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

推荐阅读