Bash:条件(if-then-else)

こんにちは

今回は条件付きのスクリプトの作り方を紹介します Bash、翻訳されたものは次のとおりです。

必要なXの処理が実行されると、Yのアクションが実行され、実行されない場合は、別のアクションが実行されます。

簡単な説明はありません😀

さて、このチュートリアルで使用するいくつかの例について数分間考えましたが、次のジレンマ/問題/状況が発生しました。

私たちは会社のネットワーク上にあり、Xコンピューターがネットワークに接続されているかどうかを知りたいです。 このために私たちは スクリプト 彼は何をしますか ping そのコンピュータに向かって、そしてそれがネットワーク上にある場合(つまり、それが ping)はい、ネットワーク上にあることを通知します。そうでない場合(つまり、ネットワーク上にない)、ネットワーク上にないことを通知します。

これが完了したら、条件付きでサイクルする方法を説明します🙂

コードは次のとおりです。

ping -c 1 DIRECCION-IP
if [ $? -ne 0 ]; then
echo "No está en red"
else
echo "Sí está en red"
fi

心配しないでください、私はあなたにこれを詳細に説明します😉

ping は使用するコマンドであり、そのPCがネットワーク上にあるかどうかを示します。 ネットワーク上にあるかどうかを確認するPCを指定するには、変更する必要があります IPアドレス 明らかに、確認したいPCのIPアドレスです。

ご覧のとおり、«-c 1«、これは私たちに必要です。 コンピューターにpingを実行すると、自分自身を押すまでこのアクションは停止しません(ping)。 [Ctrl] + [C]、だから置く«-c 1»XNUMX回の検証(XNUMX回のping試行のみ)のみを実行し、他の検証は実行しないように指示します。これにより、即座に停止します。つまり、コンピューターがネットワーク上にXNUMX回だけあるかどうかをチェックします。

これについて疑問がある場合は、痛みはありません...彼らはそう言っています、そして私は彼らにそれをもう一度説明させていただきます😉

今、私が説明したのは通常のコマンド/アクションにすぎないので、サイクルが来ます😀

if [ $? -ne 0 ]; then
echo "No está en red"
else
echo "Sí está en red"
fi

これを理解できるように、Bashの非常に重要な詳細を説明します🙂

主題について最も知識のある人は、私を間違っている、またはそのようなものとしてブランド化する可能性がありますが、ねえ、私は初心者またはそれ以下の専門家のために、彼らがそれを理解している限り、これを書きます😉

のようにそれが起こります Bash それは次のようなものです 0 y 1つまり、コマンドまたはアクションが実行されたときに、あなたは生きているか死んでいるかのどちらかです。 うまく実行された 問題ない (1)、または いくつかありました 問題または エラー (0).

Xアクションまたはコマンドを実行しますが、実行したことはうまくいったか悪いか、エラーがあったかどうかはわかりません。ここに詳細があります。

私たちが何をするために送るか(この場合: ping -c 1 IP-ADDRESS)エラーは発生せず、成功したため、次の値が返されます。 1 。 それ以外の場合、アクション(つまり、ping)が成功しなかった場合は、値を返します。 0.

 そして最後に、上記のコードが意味するのはこれです:

値0が返された場合

テキストを表示します:«ネットワーク上にない»

それ以外の場合(そして0ではなく1を返します)

テキストを表示します:«ネットワーク内にある場合«

これは、先ほど説明したとおりですが、Xアクションでエラーが発生した場合は、Yアクションを実行し、Xアクションでエラーが発生しなかった場合は、Zアクションを実行すると言えるので、今後多くのことに役立ちます。

一部の人が少し関与するかもしれないことを私は知っているので、私はそれをいくつかの異なる方法で説明しようとしました。 不明な点がある場合はお知らせください。

それでは、スクリプトを作成しましょう😀

このチュートリアルの手順に従う必要があります。 Bash:実行可能なスクリプトの作成方法

次に、次のコードをそのファイルにコピーしましょう(スクリプト.sh)、そして最後に«としましょう終了する»(引用符なし):

ping -c 1 DIRECCION-IP
if [ $? -ne 0 ]; then
echo "No está en red"
else
echo "Sí está en red"
fi

次のようになります(IPアドレスを必要なIPに変更している必要があることに注意してください)。

ここで、実行中のスクリプトを確認できます。

%CODE1%

ご覧のとおり、最終的に彼は私たちに言います«はい、ネットワーク内にあります»🙂

ここで重要なのは、彼らが実際にこの条件を理解しているということです。そこで、もう一度説明するために別のコードを残しますが、別の観点からです。

read "texto"
if [ "$texto" = "3" ]; then
echo "Correcto"
else
echo "Incorrecto"
fi

これが意味することは簡単です、私は説明を一行ずつ残します:

1行目: 私たちが書いたもの、それは変数の値になります«テキスト»(引用符なし)。

2行目: 変数の内容(今書いたもの)が 3.

3行目: ある場合 3、テキストが表示されます«正しい»(引用符なし)。

4行目: それ以外の場合(つまり、3を記述していない場合)。

5行目: テキスト«が表示されます不正解»(引用符なし)。

6行目: 状態の終わり。

彼らが実現できたように、 echo そして二重引用符の間(«)テキスト。これにより、そのテキストが端末に表示されます。 つまり、次のように記述します。

echo "esto es una prueba"

ターミナルにテキストが表示されます。 これはテストです

しかし、このXNUMX番目の例に戻って、このXNUMX番目のスクリプトの有用性(および実行)を非常に単純なもので示します😀…典型的な«1 + 2はいくらですか?«

完全なスクリプトのコードを残しておきます。

#!/bin/bash
# -*- ENCODING: UTF-8 -*-
echo "¿Cuánto es 1 + 2?"
read "texto"
if [ "$texto" = "3" ]; then
echo "Correcto"
else
echo "Incorrecto"
fi
exit

スクリプトの仕組みは次のとおりです。

%CODE2%

そしてまあ...追加するものは何もありません。

これは初歩的で単純なことですが、それでも可能な限り説明しようとしました。誰もがプログラマーの精神を持っているわけではなく、このような(または同様の)スクリプトを何度も作成する必要があるためです。いずれにせよ、この記事がお役に立てば幸いです。誰か🙂

疑問や質問、苦情や提案があれば、ここに残してください。喜んでお答えしますので、私たちは皆、もう少し学びます😀

よろしく


26コメント、あなたのコメントを残してください

コメントを残す

あなたのメールアドレスが公開されることはありません。 必須フィールドには付いています *

*

*

  1. データの責任者:MiguelÁngelGatón
  2. データの目的:SPAMの制御、コメント管理。
  3. 正当化:あなたの同意
  4. データの伝達:法的義務がある場合を除き、データが第三者に伝達されることはありません。
  5. データストレージ:Occentus Networks(EU)がホストするデータベース
  6. 権利:いつでも情報を制限、回復、削除できます。

  1.   ジャルス

    あなたはプロです!!! *または*

    1.    KZKG ^我愛羅

      いや、何もしない😀
      それがあなたに役立ち、それが面白いなら、私は満足しています😉

      友達の挨拶

  2.   適切な

    @ KZKG ^ガアラ、
    バッシュプログラミングと言えば、私は質問があります:
    このVAR = helloのように変数を宣言することと、このVAR = $ {VAR:-hello}のように宣言することの違いは何ですか?

    私が説明します:
    http://pastebin.com/a3cfWXeD

    挨拶😉

    1.    KZKG ^我愛羅

      こんにちは
      まあ、私はバッシュの専門家ではありません...実際、私は大爆笑だとは思いません!!
      変数を宣言すると、次のようになります。
      : ${OPTFOLDER:="/opt/"}

      しかし、私はいつもこのようにしたので、正直なところ違いが何であるかわかりません🙁

  3.   適切な

    @ KZKG ^ガアラ
    実は私も知らなかったので、私は質問をしました。私は通常SlackBuildsを作成し、VAR1のように宣言された変数がこれらのスクリプトにたくさんあるというのが実です。 簡単なグーグル検索は私がこの質問を明確にするのを助けました、私は私たち全員が学ぶことができるようにそれをみんなと共有します:

    スクリプト:
    http://pastebin.com/faAQb35w

    説明:
    VAR = $ {VAR:-default_value}の形式の変数を宣言することは、値がnullまたは存在しない場合にのみ、変数VARが値default_valueを取得することを意味します。

    実際の例:
    スクリプトを実行すると、VAR変数に格納する値を入力するように要求されます。何かを入力すると、入力内容が表示されます。 何も入力せずにEnterキーを押すと、変数VARがnullとして宣言されているため、default_valueが表示されます。

    ご挨拶。

    1.    KZKG ^我愛羅

      ハハ私はそれを知りませんでした😀
      わかりました、どうもありがとうございました...それは私が記事の終わりによって意味したことです、私は何かを教えるつもりはありません、そしてそれはそれです、私はいつもここで何か新しいことを学ぶことを知っています😀

      改めてご挨拶と感謝を申し上げます。

      1.    適切な

        そうです、ここでいくつかのことを学びます。

        挨拶と幸せな休日! 😀

  4.   ルーカスマティアス

    素晴らしく、よく説明された+1、それがあなたにかかった時間...
    しかし、私は努力する価値があります😉

    1.    KZKG ^我愛羅

      私は実際にたった80日で1%を書きました、私のインターネットが私を許さなかったという理由だけでそれを投稿するのにとても時間がかかりました。
      コメントありがとうございます😉

  5.   ヒューゴー

    ネットワークでICMPプロトコルがブロックされることがあるため、これを行う別の方法はDNSを使用することです。

    (host -ta IP-ADDRESS> / dev / null 2>&1)&& echo "ネットワークに接続済み"

    この例では、戻り値のチェックが暗黙的であることに気付くでしょう😉

    1.    KZKG ^我愛羅

      あなたはいつものように友達です、私が完全にハハハを知らないヒントを持っています。
      ありがとう、コメントはありがたいですそしてへへ...私が学ぶもう一つの新しいこと😀

  6.   ダタックス

    感謝

    🙂

  7.   Leper_Ivan

    このトピックの公開から数日が経過しましたが、bashでスクリプトを作成したので、非常に役立ちました..ありがとうGaara ..

  8.   エドガーナバロ

    Doc。あなたが私のために物事を明らかにしてくれた助けに感謝します。

    クエリだけですが、一方のコンピュータが自動的にpingを停止すると、もう一方のコンピュータがIPを変更するようにするにはどうすればよいですか。 私はこれを持っています。

    IPを変更するには
    #!/ bin / bashに
    ping -c 10 192.168.1.50#自動的にpingされない場合
    ifconfig eth0ネットマスク192.168.1.50ブロードキャスト255.255.255.0
    ifconfigeth0ダウン
    ifconfig eth0 アップ

  9.   アブラハム

    疑問符を使用した場合と比較すると? 置くことにはどのような違いがありますか? その他の手紙

    1.    KZKG ^我愛羅

      $? 「前の出力または出力」を意味します。つまり、前のコマンドの結果が...🙂

      1.    アンドリュー

        同じ結果を達成する別の方法があります。pingコマンドを引数としてifに直接渡します。

        ping -c 1IP-ADDRESSの場合。 その後
        エコー「はい、ネット上にあります」
        ほかに
        エコー「ネットワーク上にありません」
        fi

        何が起こるかというと、引数として渡したコマンドの戻り値を評価する場合、それが0を返す場合、それはtrueであり、それ以外はすべてfalseです。 角括弧は、テストコマンドと同等です。 ただし、任意のコマンドを引数として渡すことができます(コマンドが何らかの値を返す限り)。

  10.   よろしく

    こんにちは、スクリプトでユーザーXを使用してscript.shを実行するにはどうすればよいですか?ユーザーYを作成し、そのユーザーYはscript.shの実行を続行します

    これはできますか?

  11.   ククトス

    非常に興味深い、ありがとう!

  12.   フランシスコ

    貢献してくれてありがとう、私はそれをxDで理解するのにXNUMX時間かかりました、しかし私はそれを理解しました!!!!。

  13.   エロア

    スクリプトは問題ありません。 算術的には、ゼロに等しい場合は($?== 0)として実行することもできます。それ以外の場合は、ネットワーク上にあります。 それでももう少しインタラクティブにしたい場合は、次のように言うことができます。
    echo -n IPを入力します:
    ipを読む
    ping -c 1 $ ip

  14.   ダリオ

    こんにちは、私はこれに非常に慣れていません。読み取りでチケット番号(英数字)を作成しようとしています。入力した内容が正しい形式(ABC-123456)の場合は、「x」コマンドを実行してください。どうすればいいのかわからないのですが、手伝ってくれませんか?

    エコー「チケットを入力してください」
    -pチケットを読む

    if $ ticket = "わからない(フォーマットABC-123456"); 次にcpfile.txt $ ticket; それ以外の場合は、「フォーマットが間違っています。再試行してください」とエコーします。 -pを読む; fi。

    確かにそれはひどいです、そして彼らはハハを笑います、しかし私が言ったように私はこれから始めているところです。

    私がひどく説明するならば、私に教えてください、そして私はより良くするように努めます。

    みんなを抱きしめて。

  15.   ウンベルトY

    優れた説明、ご挨拶

  16.   アギル

    if、else、その他については少し疑問があります。
    スクリプトでファイル(ログのXNUMXつ)が存在することを確認し、存在しない場合は作成して後で書き込む必要があります。 しかし、もしそれが存在するなら、私はあなたにただそれを書いて欲しいです。

    私が持っているのは:

    日付= `日付-R`
    #変数の日付をテストしていましたが、開始から開始までの間に更新されません
    #プロセスして終了します。XNUMX時間が経過しても正しい時刻が表示されない場合があります。

    if [-f /home/user/logs/test.log];
    その後
    /home/usuario/logs/test.logにタッチします
    ほかに
    echo "$ date:Updated" >> / home / user / logs / test.log
    エコー«———————————————-»>> / home / user / logs / test.log
    fi

    理論的には問題ないはずですが、参照ファイルがすでに存在する場合は更新されないのが現実です。

    1.    アギル

      申し訳ありませんが、送信されておらず、XNUMX倍になっていることがわかりました