大衆へのコンソール。 明るい側に行く。 バッシュ

冷静なビンバッシュ



エントリー



ツールの使いやすさは、特定の問題の解決にどれだけ役立つかということにあります。 このツールをニーズに合わせてカスタマイズできることも重要です。 楽しいボーナスは、ツールに新しい機能を拡張して追加できるという事実です。



最も興味深い、興味深いトピックにbash



ました-これらはbash



スクリプトです。 ターミナルを起動すると、特別なシェルプログラムがその内部で動作します- shell



(英語)-コマンドインタープリター。 シェルは、キーボードから入力したすべてのコマンドを理解して処理します。 また、エラーメッセージを表示し、コマンドとその構文の正確さを監視します。 このようなコマンドの例としては、ディレクトリの変更、新しいディレクトリの作成、テキストファイルの追加、テキストファイルの編集、変更の保存などがあります



シェルプログラムはたくさんあります。 最初に成功した実装の1つはsh



と呼ばれます。 1977年にStephen Bourneによって開発されました( wiki )。 OS *nix



実行しているコンピューターで作業している場合の99%の場合、コマンドを処理するデフォルトのシェルはbashです。 もちろん、 zsh



などのシェルはまだありますが、これはまったく別の話です。



重要なポイント。 この記事は、bashスクリプトの完全なガイドではありません。 主な目標は、bashでのプログラミングの基本を検討し、例を示し、先に進むのに十分な基本知識を読者に提供することです。 記事の最後に役立つリンクがあり、このトピックをさらに詳しく調べることができます。



基本



最初のセクションでは、基本について説明します。 スクリプトの開始位置を検討してください。 変数の定義方法およびこれらの変数の値の変更方法。 また、スクリプトに引数を渡し、スクリプト内でこれらの引数を処理する方法も理解します。 次のセクションは分岐です。 そして最後の、しかしそれほど重要でないセクションはサイクルです。



bashスクリプトは次の行で開始する必要があります。



 #!/bin/bash
      
      





したがって、スクリプトが実行可能な場合に呼び出すプログラムをインタープリターに伝えます。



コードの移植性を改善するには、最初の行のこのバージョンを指定する必要があります。



 #!/usr/bin/env bash
      
      





bash



へのパスが異なるシステムで同じになることは保証されません。 env



を指定することで、このような驚きから身を守ります。 繰り返しますが、これは、異なるシステム、コンピューターなどでスクリプトを使用する予定がある場合です。 これが不要な場合は、最初のオプションが最適です。 すべての例で、最初のオプションが使用されます。



デフォルトでは、ユーザーが作成したすべてのファイルは実行可能ではありません。 次のコマンドを使用して、特定のファイルにこのパラメーターを明示的に指定する必要があります。



 chmod +x <filename>
      
      





次のコマンドを使用して、このパラメーターなしでスクリプトを実行できます。



 bash <filename>
      
      





変数



変数は、メモリ内の名前付き領域です。 つまり、変数には名前があり、特定のコンピューターのメモリの場所を参照します。 通常、変数は何らかの情報を保存するために使用されます。 変数は、名前と値の2つの部分で構成されます。



変数名:





変数値:





変数の作成(上書き):



 path="$HOME"
      
      





等号の前後にスペースを入れないでください。



変数の読み取り:



 "$path"  "${path}"
      
      





ほとんどの場合、両方のオプションは同じように機能します。 場合によっては、あいまいさが生じると、この形式の記述のみが正しく機能します: "${path}"







スクリプトに引数を渡す:



 ./script.sh arg1 arg2 arg3 … argN
      
      





スクリプト内の引数の処理:



 "$1" #   "$2" #   "$0" #   "$#" #   "$*" #       () "$@" #  $*,          (), # ..      
      
      





さて、最初のスクリプトを書く時が来ました。 当然のことながら、スクリプトはユーザーの画面に「Hello、world!」という文字列を表示します。



#!/bin/bash
echo "Hello, world!"
# ./hw.sh - how this script should be called
view raw hw.sh hosted with ❤ by GitHub
そのように、bashで「Hello、world!」の例を実装できます。 リポジトリにあるすべての例を思い出します 。 別の例を見てみましょう。 今回は、変数と、ユーザーがスクリプトに渡す引数を操作します。



#!/bin/bash
var1="$1"
var2="$2"
echo "Arguments are ${var1} and ${var2}"
# ./variables.sh Hello world - how this script should be called
view raw variables.sh hosted with ❤ by GitHub
通常、bashで記述されたすべてのプログラムの拡張子は.sh



であることに注意してください。





基本と変数は少し整理されました。 では、ブランチに移りましょう。 次の構成は、bashでブランチを操作するために使用できます。



  1. if



  2. if/else



  3. if/elif/else



  4. case/in/esac





最初の3つのオプションは似ており、後続の各構成は前の構成を補完します。 最も単純なオプションを検討してください。



if [[ condition ]]
then
# an action, if condition is true
fi
view raw if.sh hosted with ❤ by GitHub
各行の終わりにセミコロンがないことに注意してください。 1行に条件を(だけでなく)書き込むことができます。その場合、セミコロンが必要です。



ブランチを操作するときは、行が空かどうか、番号がゼロかどうか、ファイルを操作しているか、これがディレクトリかどうかを何らかの方法で確認する必要があります。 このようなタスクの場合、bashには独自の構文があります。 文字列、数字、ファイル、論理の4つのカテゴリに分けました。 それらを見てみましょう。



条件(行):



-z <string> # string is empty
-n <string> # string is not empty
<str1> == <str2> # strings are equal
<str1> != <str2> # strings are not equal


条件(数値/行):



<numbers/strings> operation <numbers/strings>
-eq, (==) # equal
-ne, (!=) # not equal
-lt, (<) # less than
-le # less than or equal
-gt, (>) # more than
-ge # more than or equal


条件(ファイル):



-e <path> # path is exist
-f <path> # is file
-d <path> # is directory
-s <path> # file size more than 0
-x <path> # file is executable


条件(論理):



! # denial of boolean expression
&& # boolean "and"
|| # boolean "or"


if/else



オプションはスキップします。 しかしif/elif/else



、例を検討するif/elif/else



提案します。



#!/bin/bash
if [[ -f "$1" ]]
then
echo "Removing file ${1}"
rm "$1"
elif [[ -d "$1" ]]
then
echo "Removing dir ${1}"
rm -r "$1"
else
echo "Can't remove ${1}"
fi
view raw if_elif_else.sh hosted with ❤ by GitHub
スクリプトは、入力で1つの引数(ファイル名またはディレクトリ名)を受け取ることを想定しています。 次のステップは、これがファイルかディレクトリかを確認することです。 はいの場合、削除します。 渡された引数がファイルでもディレクトリでもない場合、削除できないというメッセージをユーザーに表示します。



分岐の最後のバリアントを考慮することは残ります-これはcase/in/esac



です。 JavaScriptに例えると、これは実装オプションswitch/case



です。 この構造も例で考えてみましょう。



#!/bin/bash
# ./case_in_esac.sh 2 1
# Creating dir 1
# ./case_in_esac.sh 1 2
# Creating file 2
if [[ "$#" -ne 2 ]]
then
echo "You should specify exactly two arguments!"
else
case "$1" in
1)
echo "Creating file ${2}"
touch "$2"
;;
2)
echo "Creating dir ${2}"
mkdir "$2"
;;
*)
echo "Wrong value"
;;
esac
fi
view raw case_in_esac.sh hosted with ❤ by GitHub


このスクリプトは、1つと2つの2つの数値引数を受け取ることを想定しています。 そして、どの引数が最初に来るかに応じて、ファイルまたはディレクトリが作成されます。 ユーザーが渡した引数の数のチェックもあります。 引数の数は2より少なくてはなりません。 ユーザーが誤った引数を指定した場合、それについてのメッセージを表示します。 これはデフォルト値が原因です。



サイクル



次のセクションでは、ループの操作について説明します。 bashの兵器庫でのループの構成には、 for/in



およびwhile



ような構造があります。



構文のfor/in



見てみましょう。



for i in array
do
# an action, i on every iteration is getting
# the next value from array
done
view raw for_in.sh hosted with ❤ by GitHub


i



は、配列要素が渡される変数の名前です。 array



は配列そのものです。 後続の各反復で、 i



は配列から次の値を取得します。 例を考えてみましょう:



#!/bin/bash
for i in 1 2 3 4 5
do
file_name="file${i}.txt"
if [[ -e "$file_name" ]]
then
continue
fi
echo "Creating file ${file_name}"
touch "$file_name"
done
view raw for_in.sh hosted with ❤ by GitHub


値のリストがあります: 1 2 3 4 5



。 すべての値を実行するサイクルを開始します。 file_name



変数を作成します。 次に、同じ名前のファイルが存在するかどうかを確認します。 ファイルがない場合は作成し、ある場合は作成手順をスキップします。



単語continue



気付いたかもしれません-これはキーワードです。 反復をスキップして、さらに作業を続けることができます。 break



キーワードもあります-スクリプトの実行を中断します。 これらのキーワードはif/else



コンテキストでのみ使用されif/else







ループを操作するために検討する次の構成は、 while



です。



while [ condition ]
do
# an action, while condition is true
done
view raw while.sh hosted with ❤ by GitHub


すぐに例を検討することをお勧めします。



#!/bin/bash
# while.sh
again="yes"
while [ "$again" = "yes" ]
do
echo "Please enter a name:"
read name # !!!
echo "The name you entered is ${name}"
echo "Do you wish to continue? (yes/no)"
read again # !!!
done
view raw while.sh hosted with ❤ by GitHub


この例では、 read



キーワードを持つ2つの行がありread



。 これらの行がどのように機能するかをさらに詳しく考えてみましょう。 つまり、行番号12と行番号8。 行番号12から始めましょう。 $again



変数が"yes"



に設定されている限り、プログラムはユーザー名を要求し、画面に表示します。 その後、スクリプトは続行するかどうかを尋ねます。 そして、ユーザーがyes



代わりに他の行をEnter



か、単にEnter



押すまで続きます。 しかし、さらに興味深いのは、行番号8のコードです。 以前に宣言されていない変数$name



があります。 この変数は動的に作成され、その値が読み取られます。



便利なリンク



  1. bashの基本
  2. バッシュハンドブック
  3. 落とし穴バッシュ
  4. Advanced Bash-Scripting Guide [en] (リンクについてはKonkaseに感謝します
  5. 高度なBashスクリプトガイド (リンクをありがとう)
  6. Googleシェルスタイルガイドleoismyname 、リンクをありがとう)
  7. #!/ Usr / bin / envの意味と利点は何ですか?Borzはリンクをありがとう)
  8. コマンドラインを学ぶ
  9. コマンドラインクラッシュコース
  10. 英語のLinuxコマンドライン
  11. 基本的なUnixコマンド


結論の代わりに



この肯定的なメモで、bashの紹介を終了します。 この情報は、単純なスクリプトを実装するだけでなく、日常のタスクを自動化するのに十分です。



今後の展望では、次の記事では、bashスクリプトを使用してルーチンタスクを自動化する方法の理論が減り、さらに多くの例が出てくると言います。 お楽しみに。



以上です。 ご清聴ありがとうございました。 最後まで読んでくれた人、ありがとう。 次の記事でお会いしましょう。



UPD。 コメントの議論に基づいて、記事のテキストが更新されました。 議論に積極的に参加してくれたすべての人に感謝します。 あなたは記事をさらに良くしました。 そして単なる記事ではありません。



All Articles