任意のプログラムで役立つシェルスクリプト

Bash 注文を解釈する機能を持つコンピュータプログラムです。 それはのシェルに基づいています Unixの プロジェクトのために書かれました GNU のほとんどのディストリビューションのデフォルトシェルである GNU / Linuxの。 彼の名前はの頭文字です ボーンアゲインシェル (別のシェルボーン)、言葉遊びをする (生まれ変わったということは再生を意味します) 上の ボーンシェル(sh)、Unixの最初の主要な通訳者のXNUMX人でした。

今日は、開発者にとって非常に役立つシェルスクリプトをいくつか紹介します。 ほとんどはどのシェルでも機能します Unixの、ただし、特別に実行する必要があるものもあります Bash.

非特権ユーザーがスクリプトを実行できないようにする

一部のスクリプトは管理タスクを実行するため、rootユーザーのみにスクリプトを実行させたい場合があります。 その場合、次のようなものを使用できます。

#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "Este script debe ser ejecutado por el usuario root" 1>&2
exit 1
fi

特定のユーザーにのみスクリプトの実行を許可する

上記のコードと同様に、特定のユーザーのみにスクリプトを実行させたい場合があります。 私たちはそうします:

#!/bin/bash
AUTHORIZED_USER="usuario_permitido"
if [ $USER != $AUTHORIZED_USER ]; then
echo "Este script debe ser ejecutado por el usuario $AUTHORIZED_USER" 1>&2
exit 1
fi

サービス/プロセスが実行されていることを確認します

実行中のサービスまたはプログラムのプロセスがあるかどうかを知りたい場合は、このスクリプトを使用できます (この場合、それはの悪魔が アパッチ が走っています):

#!/bin/sh
SERVICE='httpd'
if ps ax | grep -v grep | grep $SERVICE > /dev/null
then
echo "El servicio $SERVICE esta ejecutandose"
else
echo "Chanfle! El servicio $SERVICE esta detenido"
fi

ロックファイルを作成する

スクリプトがXNUMX回以上同時に実行されないようにする必要がある場合があります。 このために、ロックファイルを利用できます。 これは、これを可能にするスクリプトの単純なバージョンです。

#!/bin/bash
lockfile=/var/lock/loquesea.lock
if [ ! -e $lockfile ]; then
touch $lockfile
echo "hago muchas cosas importantes aqui"
rm $lockfile
else
echo "ya hay otro proceso corriendo"
fi

この場合、ファイルが 何でも.lock 存在します。 存在する場合、スクリプトはそのタスクを実行しません。 存在しない場合は、ファイルを作成し、実行する必要のあるタスクを実行して、ファイルを削除します。 しかし、これは完全に信頼できるわけではありません。 スクリプトの実行中にスクリプトが突然閉じられた場合はどうなりますか?

その場合、ロックファイルは削除されないため、スクリプトを再度実行することはできません。 これらのケースをカバーするために、スクリプトが予期せず終了した場合にコマンドを実行できるtrapコマンドを利用できます。 これはより高度なバージョンであり、スクリプトを実行するスクリプトのPIDをロックファイル内に保存します。

#!/bin/bash
lockfile=/var/lock/loquesea.lock
if ( set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null;
then
trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT
echo "hago muchas cosas aqui tranquilamente"
rm -f "$lockfile"
trap - INT TERM EXIT
else
echo "Ya hay otro proceso de este script ejecutandose"
echo "corriendo con el PID: $(cat $lockfile)"
fi

コマンドをもう少しよく理解しましょう トラップ。 その構文は基本的に次のとおりです。trapcommandsignal[signal…]; ここで、signalはキャッチしたい終了信号です。 使用可能な信号のリストを表示したい場合は、コマンドkill-lを実行できます。 前のケースでは、INT信号が使用されました (Ctrl + cによって生成された終了をキャプチャします)、 期間 (killコマンドによって生成された終了) およびEXIT (実行する行がなくなったか、exitコマンドに遭遇したため、スクリプトが正常に終了します).

オプションメニュー

ユーザーが一連のオプションを選択できるメニューを作成するには、次のスキームを使用できます。

#!/bin/bash
clear
while :
do
echo " Escoja una opcion "
echo "1. quien soy?"
echo "2. cuanto espacio tengo"
echo "3. que es esto?"
echo "4. Salir"
echo -n "Seleccione una opcion [1 - 4]"
read opcion
case $opcion in
1) echo "este eres:";
whoami;;
2) echo "tienes esto";
df;;
3) uname -r;;
4) echo "chao";
exit 1;;
*) echo "$opc es una opcion invalida. Es tan dificil?";
echo "Presiona una tecla para continuar...";
read foo;;
esac
done

スクリプトを実行する前に確認を求めてください

ステートメントのバッチの実行をユーザーに確認してもらうと便利な場合があります。これは、ユーザーに「はい」または「いいえ」を入力するように求める一般的なメッセージです。 これは次のように実行できます。

#!/bin/bash
while true; do
echo
read -p "esta seguro de hacer lo que sea que vaya a hacer " yn
case $yn in
yes ) break;;
no ) exit;;
* ) echo "por favor responda yes o no";;
esac
done
echo "si se ejecuta esto es que aceptaste"

記事の終わり。 単に素晴らしい😀

編集: 何らかの理由で出てこないスペースやタブに注意する必要があります¬¬


コメントを残す

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

*

*

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

  1.   KZKG ^我愛羅

    彼らは素晴らしいO_Oです...それは私がBashで行う私の小さなことに大いに役立ちます😀

  2.   ren434

    スクリプトは素晴らしいです!私が探していたものだけで、真剣に素晴らしい貢献をしました。

    PS:フォーラムはダウンしています。

    1.    KZKG ^我愛羅

      はい、フォーラムがマウントされているサーバーはオフラインです。理由はわかりません...私たちはそれを管理している友人にメールを書いて、彼が私たちに何を応答するかを確認しました🙂

      ご挨拶。

  3.   ren434

    まあ、それが深刻なことではないことを願いましょう。

  4.   左利き

    その「もみ殻」はコード忍者にも含まれていましたか? XD

  5.   タレゴン

    私はbashの力が好きです😉そして彼らはC言語が何のためにあるのか教えてくれました…なぜならシェルスクリプトには多くのなじみのあるコマンドがあるからです。

  6.   クリストファー

    ありがとう、私は本当に好きだった

  7.   エンジェルブレード

    入力パラメータの検証は非常に便利です。 メニューの作り方がわからなかった=)

  8.   日向ネジ

    すごい…。 今、私は私のスクリプトにいくつかの「硬さ」を与えることができますchurros lol

  9.   カラス

    CodeNinjaでの私たちの謙虚な仕事が国際的なLinuxコミュニティにどのように役立つかを見るのは大きな喜びです

    1.    KZKG ^我愛羅

      晴れ! 🙂
      すべては一緒に助けて貢献することであり、炎を作ることではありませんよね? 😉

  10.   ディエゴ

    実行中のプロセススクリプトは、知りたいプロセスを選択するオプションを配置することで少し改善できます。次のようになります。

    #!/ bin / bashに
    エコー「サービスを選択してください」
    サービスを読む
    #SERVICE = 'mysql'
    psaxの場合| grep -v grep | grep $ SERVICE> / dev / null
    その後
    echo "$ SERVICEサービスが実行されています"
    ほかに
    echo "$ SERVICEサービスが停止しています"

  11.   フアカルロスC

    私はあなたのスクリプトを非常に実用的ですが、私が抱えている問題を解決するための特別なスクリプトを探しています。それは次のとおりです。社内ユーザーがtelnetでアクセスするアプリケーションサーバーが社内にあり、制限された特別なアプリケーションを実行します。ライセンスの場合、ユーザーは複数のtelnetを悪用して開き、2つ以上のライセンスを引き継ぐため、私が考えたスクリプトは、何らかの方法で、どのtelnetプロセスが2時間以上非アクティブであるかを確認し、それを強制終了することです。 pid、助けてくれませんか?

    1.    ディエゴ

      次のプログラムをインストールします

      aptitude installautolog

      そして、/ etc /autolog.confに設定ファイルがあります

  12.   ティト

    素晴らしい、友人、私はあなたに質問をすることができます、私はオプション付きのシェルスクリプトが必要です、そして私はあなたに基づいています、そしてそれはうまくいきます、しかしオプションのXNUMXつは(postifixを使って)電子メールを送る必要があります、それは画面上の件名、テキストと受信者と何を尋ねます送信して正しく送信されていることを確認します。mailqを使用すると、キューを確認して送信されたかどうかを確認できますが、件名、テキスト、受信者を受信した変数を使用してコマンドでメールを送信するにはどうすればよいですか。 🙁

    1.    KZKG ^我愛羅

      私の電子メールに書いてください (kzkggaara[at]desdelinux[dot]net) もっと冷静に話したいので、喜んでお手伝いさせていただきます :)

      1.    ティト

        よろしくお願いします。合格しました。

  13.  

    こんにちは良いです。
    メニューが必要になったときに、これらの優れた例に出くわしました。
    私はそれを始めました、そして、私はそれを動かすことができません(前のステップで)。
    247の要素があり、さまざまな領域を参照しています。
    私が必要としているのは、国を選択する場所からのメニューです。
    #!/ bin / bashに
    クリア
    一方:
    do
    エコー»試す国を選択してください»
    エコー«1。 アフガニスタン(AF)»
    エコー«2。 アルバニア(AL)»
    エコー«3。 ドイツ(DE)»
    エコー«5。 アンゴラ(AO)»
    エコー«6。 アンギラ(AI)»
    ..そして247まで続く

    echo -n "オプションを選択してください[1-247]"
    読み取りオプション
    ケース$オプション
    1)echo "this is you:"; whoami ;;
    2)エコー「あなたはこれを持っています」; df ;;
    3)エコー ""; うなめ-r ;;
    4)echo "bye"; exit 1 ;;
    5)echo "this is you:"; whoami ;;
    6)echo "this is you:"; whoami ;;
    …そして247まで続く
    *)echo«$ opcは無効なオプションです。 とても難しいですか?」;
    echo "続行するにはキーを押してください...";
    fooを読む;;
    ESAC
    行われ

    動作は次のとおりです。
    出力である4以外のオプションは、入力された番号を削除し、新しい番号を待ちます。
    4を入力すると出てきます。
    4のコードを他の行(たとえば150)に入れると、問題なく同じように出力されます。
    また、コードを次の形式で配置しようとしました。
    151)echo "this you are:";
    私は誰 ;;
    同じ結果になります。
    このような長いメニューにはもっと良いオプションがあるのだろうか、そしてもちろん私も間違っている。
    助けていただければ幸いです、ありがとう

  14.   ラウルだけ

    素晴らしい...シェルに入るのはとても良いことだと思います

    感謝

  15.   ランドマーク

    素晴らしい、ねえ、どうすればファイルでbashを機能させることができますか
    例:

    アップロード.sh 写真デラベシナ.jpg

    私のbashスクリプト「upload.sh」が私のftpへのアクセス情報を持っていると思います

    挨拶と感謝😀

  16.   ネツロ ntx

    いいやつ、すべてのスクリプトに感謝します。CentOSサーバーをセットアップしましたが、これらのテンプレートがどれだけうまく機能するかわかりません。メールでご連絡ください。 私はあなたに何かを提案したい

  17.   ガブリエルバルデラモス

    メニューを作成するときになぜreadfooを使用するのですか? 必要なクイックアンサー