if、elif、elseステートメントがBashで発行される


358

私は、次の問題どのような動作するように見えることはできませんif文がに関してであるelifthenprintfまだ開発中であることを覚えておいてください。ステートメントでまだテストできていないので、おそらく間違いです。

私が得ているエラーは:

./timezone_string.sh: line 14: syntax error near unexpected token `then'
./timezone_string.sh: line 14: `then'

そして声明はそうです。

if [ "$seconds" -eq 0 ];then
   $timezone_string="Z"
elif[ "$seconds" -gt 0 ]
then
   $timezone_string=`printf "%02d:%02d" $seconds/3600 ($seconds/60)%60`
else
   echo "Unknown parameter"
fi

7
なぜ、ではなく、一般的にもこのステートメントが必要なのかと思います。thenifelifelse

@ w17t、条件からシーケンスを分離する必要があるため。
Sasha

3
@codeforester 500Kビューの質問を5Kのみの質問への複製としてマークするロジックはあまりありません
fedorqui 'SO stop harming'

いくつかのコード自動フォーマットツールを使用すると、角かっこの周りのスペースを自動的に追加/削除するのに役立ちます。エディターのプラグインを検索できます。
Nj Subedi

回答:


453

elifとの間にスペースがありません[

elif[ "$seconds" -gt 0 ]

する必要があります

elif [ "$seconds" -gt 0 ]

この質問は多くの意見を得ているので、従うべき構文は次のとおりであることを示すことが重要です。

if [ conditions ]
# ^ ^          ^

括弧の前後にスペースが必要であることを意味します。それ以外の場合は機能しません。これは、[それ自体があるコマンド。

あなたが何かのように表示されない理由elif[: command not found(または類似の)ことを見た後にされたifthen、シェルは、どちらかを探しているelifelseまたはfi。しかし、それは別のものを見つけますthen(誤ってフォーマットされた後elif[)。ステートメントを解析したでのみ、ステートメントが実行されます(そして、次のようなエラーメッセージelif[: command not foundが出力されます)。


33
角かっこにスペースが必要なのは、実際のプログラムのショートカットにすぎないためです(少なくとも最初の角かっこ、2番目のかっこは、私が理解しているように、単なる構文上の砂糖です)。それの意味を理解するには、左側のブラケットの実際のマンページを参照してください:$ man [
マイケル・ヨハンセン

3
この投稿はタイプミスとして閉じられるべきではありませんか?
zx8754 2018年

3
@ zx8754は可能だったかもしれませんが、このエラーを修正するための標準的な方法にはなりませんでした。これは非常に便利に見えます(360Kのビューとカウント)。
fedorqui「SO害をやめる」

3
一部の同僚は、「スペース」または「コーディングスタイル」の概念を理解していないため、これはタイプミスではない可能性があります。
juzzlin

3
[は、テストコマンドの一種のエイリアスです。これが、空白文字が必要な理由です。if test "$seconds" -eq 0; then ... fiと同等if [ "$seconds" -eq 0 ];then ... fi ]です。@LeiYang man testはあなたが実際に探しているものです
Melicerte

303

スクリプトの構文に問題があります。ここに修正バージョンがあります:

#!/bin/bash

if [ "$seconds" -eq 0 ]; then
   timezone_string="Z"
elif [ "$seconds" -gt 0 ]; then
   timezone_string=$(printf "%02d:%02d" $((seconds/3600)) $(((seconds / 60) % 60)))
else
   echo "Unknown parameter"
fi

76
奇妙なことに、これは私がstackexchangeで簡単に見つけた唯一の完全で単純な bash「if-then-else」構成でした...ありがとう。
ワイルドカード

1
インデントはオプションです。インタプリタはであることができます(そしてそうすべきです)#!/bin/sh

3
@ Chinggis6 まったくナンセンスです。通訳は可能です#!/bin/sh、そうである必要はありません。
Camusensei 2017

4
@Camusensei sh互換性を高めるために代わりに使用できるので、それは完全にナンセンスではありません(すべての* nixディストリビューションがデフォルトのシェルとしてbashを持っているわけではありません(一部はkshまたはashを持っていますが、それらのほとんどはsh機能する標準に依存しています)。さらに、bash固有の場合または高度な機能がスクリプトで使用されていない場合、それ自体でスクリプトを処理できるため、 'sh'をインタープリタとして使用する必要があります(もう1つの理由)

6
@ Chinggis6私の側での言葉の正しい、悪い選択。
Camusensei 2017

25

[コマンド(または一部のシェルでは組み込み)です。空白で前のステートメントと区切る必要があります。

elif [

3
bashの組み込みによってスーパーシードされていますが、メッセージはまだ正しいです。それtype -a [を見るために使用します。
Camusensei 2017

また、いつも私には奇妙に思えたバイナリでもあります。
mr.zog

4

bashのコンディショニングの基本をご覧になることをお勧めします。

記号「[」はコマンドであり、その前に空白が必要です。elifの後に空白を入れない場合、システムはelif [を特定のコマンドとして解釈しますが、これは現時点では絶対に必要なコマンドではありません。

使用法:

elif(A COMPULSORY WHITESPACE WITHOUT PARENTHESIS)[(A WHITE SPACE WITHOUT PARENTHESIS)conditions(A WHITESPACE WITHOUT PARENTHESIS)]

つまり、コードセグメントを次のように編集します。

elif [ "$seconds" -gt 0 ]

コンパイルエラーがなくても問題ありません。最終的なコードセグメントは次のようになります。

#!/bin/sh    
if [ "$seconds" -eq 0 ];then
       $timezone_string="Z"
    elif [ "$seconds" -gt 0 ]
    then
       $timezone_string=`printf "%02d:%02d" $seconds/3600 ($seconds/60)%60`
    else
       echo "Unknown parameter"
    fi

2

プログラムelif[残りのプログラムの間にスペースがありません。あなたはそれを修正し、チェックアウトする必要があります。ここに修正プログラムがあります:

#!/bin/bash

if [ "$seconds" -eq 0 ]; then
   timezone_string="Z"
elif [ "$seconds" -gt 0 ]; then
   timezone_string=$(printf "%02d:%02d" $((seconds/3600)) $(((seconds / 60) % 60)))
else
   echo "Unknown parameter"
fi

このbash if elseステートメントに関連する便利なリンク

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.