構文エラー「elif」が予期せず予想された後[閉じる]

構文エラー「elif」が予期せず予想された後[閉じる]

エラーを修正するために私のコードに関する新しい質問を投稿しています。

    if [ -f /etc/centos-release ]; then
        OS="CentOs"
        VERFULL=$(sed 's/^.*release //;s/ (Fin.*$//' /etc/centos-release)
        VER=${VERFULL:0:1} # return 6 or 7
    elif [ -f /etc/lsb-release ]; then
        OS=$(grep DISTRIB_ID /etc/lsb-release | sed 's/^.*=//')
        VER=$(grep DISTRIB_RELEASE /etc/lsb-release | sed 's/^.*=//')
    elif [ -f /etc/os-release ]; then
        OS=$(grep -w ID /etc/os-release | sed 's/^.*=//')
        VER=$(grep VERSION_ID /etc/os-release | sed 's/^.*"\(.*\)"/\1/')
     else
        OS=$(uname -s)
        VER=$(uname -r)
    fi

ここのコードはelif [ -f /etc/lsb-release ]; thenエラーを示しています。

答え1

シェルが公開したスクリプトの5行目でこのエラーを報告した場合、then最初の行に目に見えないエラーがあるはずです。

レビュースクリプトを使用して、cat -A行に予期しないALTスペースまたは他の印刷できない文字があるかどうかを確認できます。cat -A各行の末尾に、改行文字、プレフィックス付きの制御文字、プレフィックスセットのビット8を持つ印刷できない文字が表示されます。たとえば、TAB文字はで表されます。$^M-^I

出力がcat -A少し歪んで見えるかもしれませんが、印刷できない文字がないことを確認するのに最適な方法です。

答え2

次のコマンドを実行してファイルを変更できます。

sed -i 's/\r$//' filename

答え3

この種の問題が発生しました。私の解決策は、ファイルからdos2unixを実行することでした。それからすべてが大丈夫でした。

答え4

このスクリプトの部分は私にとってうまくいきます。 @telecoMが指摘したように、スクリプトに奇妙な文字がある可能性があります。

$ cat -A x1
#!/bin/bash$
    if [ -f /etc/centos-release ]; then$
        OS="CentOs"$
        VERFULL=$(sed 's/^.*release //;s/ (Fin.*$//' /etc/centos-release)$
        VER=${VERFULL:0:1} # return 6 or 7$
    elif [ -f /etc/lsb-release ]; then$
        OS=$(grep DISTRIB_ID /etc/lsb-release | sed 's/^.*=//')$
        VER=$(grep DISTRIB_RELEASE /etc/lsb-release | sed 's/^.*=//')$
    elif [ -f /etc/os-release ]; then$
        OS=$(grep -w ID /etc/os-release | sed 's/^.*=//')$
        VER=$(grep VERSION_ID /etc/os-release | sed 's/^.*"\(.*\)"/\1/')$
     else$
        OS=$(uname -s)$
        VER=$(uname -r)$
    fi$
$ ./x1
$

関連情報