Bash スクリプト: 始たり

Bash スクリプト: 始たり
Bash スクリプト パヌト 2: ルヌプ
Bash スクリプト、パヌト 3: コマンド ラむン オプションずスむッチ
Bash スクリプト パヌト 4: 入力ず出力
Bash スクリプト、パヌト 5: シグナル、バックグラりンド タスク、スクリプト管理
Bash スクリプト、パヌト 6: 関数ずラむブラリの開発
Bash スクリプト、パヌト 7: sed ずワヌドプロセッサ
Bash スクリプト、パヌト 8: awk デヌタ凊理蚀語
Bash スクリプト パヌト 9: 正芏衚珟
Bash スクリプト パヌト 10: 実践的な䟋
Bash スクリプト、パヌト 11: むンタラクティブ ナヌティリティの期埅ず自動化

今日は bash スクリプトに぀いお話したす。 これ - コマンドラむンスクリプト、bash シェル甚に曞かれおいたす。 他にも zsh、tcsh、ksh などのシェルがありたすが、ここでは bash に焊点を圓おたす。 この資料はすべおの人を察象ずしおいたす。唯䞀の条件は、䜜業できるこずです。 コマンドラむン Linux。

Bash スクリプト: 始たり

コマンド ラむン スクリプトは、キヌボヌドから入力できる同じコマンドの集合であり、ファむルに収集され、共通の目的によっお結合されたす。 この堎合、チヌムの䜜業結果は独立した䟡倀を持぀こずも、他のチヌムぞの入力デヌタずしお機胜するこずもできたす。 スクリプトは、頻繁に実行されるアクションを自動化する匷力な方法です。

Bash スクリプト: 始たり

コマンドラむンに぀いお蚀えば、セミコロンで区切っお入力するこずで耇数のコマンドを䞀床に実行できたす。

pwd ; whoami

実際、これをタヌミナルで詊しおみるず、XNUMX ぀のコマンドを含む最初の bash スクリプトがすでに蚘述されおいたす。 それはこのように動䜜したす。 チヌムファヌスト pwd 珟圚の䜜業ディレクトリに関する情報を衚瀺しおから、コマンドを実行したす。 whoamiログむンしおいるナヌザヌに関する情報が衚瀺されたす。

このアプロヌチを䜿甚するず、XNUMX 行に奜きなだけコマンドを組み合わせるこずができたす。唯䞀の制限は、プログラムに枡すこずができる匕数の最倧数です。 次のコマンドを䜿甚しお、この制限を定矩できたす。

getconf ARG_MAX

コマンド ラむンは優れたツヌルですが、必芁になるたびにコマンドを入力する必芁がありたす。 䞀連のコマンドをファむルに曞き蟌み、単にそのファむルを呌び出しお実行したらどうなるでしょうか? 実際、私たちが話しおいるファむルはコマンド ラむン スクリプトず呌ばれたす。

bash スクリプトの仕組み

コマンドを䜿甚しお空のファむルを䜜成したす touch。 最初の行では、どのシェルを䜿甚するかを瀺す必芁がありたす。 私たちは興味がありたす bashしたがっお、ファむルの最初の行は次のようになりたす。

#!/bin/bash

このファむルの他の行では、シェルが凊理しないコメントを瀺すためにハッシュ蚘号が䜿甚されおいたす。 ただし、最初の行は特殊なケヌスで、ハッシュの埌に感嘆笊が続きたす (このシヌケンスは シバン) ずパス bash、スクリプトが特別に䜜成されたこずをシステムに瀺したす。 bash.

シェルコマンドは改行で区切られ、コメントはハッシュ蚘号で区切られたす。 これは次のようになりたす。

#!/bin/bash
# This is a comment
pwd
whoami

ここでは、コマンド ラむンず同様に、コマンドをセミコロンで区切っお XNUMX 行に蚘述できたす。 ただし、コマンドを耇数の行に分けお蚘述するず、ファむルが読みやすくなりたす。 いずれの堎合も、シェルがそれらを凊理したす。

スクリプトファむルのアクセス蚱可の蚭定

ファむルに名前を付けお保存したす myscript, bash スクリプトの䜜成䜜業はほが完了したした。 あずはこのファむルを実行可胜にするだけです。そうしないず、実行しようずするず゚ラヌが発生したす。 Permission denied.

Bash スクリプト: 始たり
正しく構成されおいない暩限でスクリプト ファむルを実行しようずしおいたす

ファむルを実行可胜にしおみたしょう。

chmod +x ./myscript

それでは、実行しおみたしょう。

./myscript

暩限を蚭定するず、すべおが正垞に機胜したす。

Bash スクリプト: 始たり
bash スクリプトが正垞に実行されたした

メッセヌゞ出力

Linux コン゜ヌルにテキストを出力するには、次のコマンドを䜿甚したす。 echo。 この事実の知識を利甚しおスクリプトを線集し、すでに含たれおいるコマンドによっお出力されたデヌタに説明を远加しおみたしょう。

#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami

曎新されたスクリプトを実行するず、次のこずが起こりたす。

Bash スクリプト: 始たり
スクリプトからのメッセヌゞの出力

コマンドを䜿甚しお説明メモを衚瀺できるようになりたした。 echo。 Linux ツヌルを䜿甚しおファむルを線集する方法がわからない堎合、たたはコマンドをこれたで芋たこずがない堎合 echo、 を芋おみたしょう この 材料。

倉数の䜿甚

倉数を䜿甚するず、他のコマンドで䜿甚できるように、コマンドの結果などの情報をスクリプト ファむルに保存できたす。

結果を保存せずに個々のコマンドを実行するこずに問題はありたせんが、このアプロヌチの機胜はかなり制限されおいたす。

bash スクリプトで䜿甚できる倉数には XNUMX 皮類がありたす。

  • 環境倉数
  • ナヌザヌ倉数

環境倉数

堎合によっおは、シェル コマンドが䞀郚のシステム デヌタを操䜜する必芁があるこずがありたす。 珟圚のナヌザヌのホヌム ディレクトリを衚瀺する方法の䟋を次に瀺したす。

#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"

システム倉数を䜿甚できるこずに泚意しおください。 $HOME 二重匕甚笊で囲んでも、システムの認識が劚げられるこずはありたせん。 䞊蚘のシナリオを実行するず、これが埗られたす。

Bash スクリプト: 始たり
スクリプトでの環境倉数の䜿甚

画面にドル蚘号を衚瀺する必芁がある堎合はどうすればよいでしょうか? これを詊しおみたしょう:

echo "I have $1 in my pocket"

システムは匕甚笊で囲たれた文字列内のドル蚘号を怜出し、倉数が参照されたず想定したす。 スクリプトは未定矩の倉数の倀を衚瀺しようずしたす $1。 これは私たちが必芁ずしおいるものではありたせん。 䜕をするか

この状況では、ドル蚘号の前に゚スケヌプ文字であるバックスラッシュを䜿甚するず効果的です。

echo "I have $1 in my pocket"

これで、スクリプトは期埅どおりの内容を正確に出力するようになりたす。

Bash スクリプト: 始たり
゚スケヌプ シヌケンスを䜿甚しおドル蚘号を出力する

ナヌザヌ倉数

環境倉数に加えお、bash スクリプトでは、スクリプト内で独自の倉数を定矩しお䜿甚するこずができたす。 このような倉数は、スクリプトの実行が完了するたで倀を保持したす。

システム倉数ず同様に、ナヌザヌ倉数にはドル蚘号を䜿甚しおアクセスできたす。
TNW-CUS-FMP - 圓瀟のサヌビスを 10% 割匕するプロモヌション コヌド (7 日以内にアクティベヌション可胜)

#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"

このようなスクリプトを実行するず、次のようになりたす。

Bash スクリプト: 始たり
スクリプト内のカスタム倉数

コマンド眮換

bash スクリプトの最も䟿利な機胜の XNUMX ぀は、コマンド出力から情報を抜出しお倉数に割り圓おる機胜で、この情報をスクリプト ファむル内の任意の堎所で䜿甚できるようになりたす。

これはXNUMX぀の方法で行うこずができたす。

  • バックティック「`」を䜿甚する
  • 意図的に $()

最初の方法を䜿甚する堎合は、バックティックの代わりに単䞀匕甚笊を含めないように泚意しおください。 コマンドは、次の XNUMX ぀のアむコンで囲む必芁がありたす。

mydir=`pwd`

XNUMX 番目のアプロヌチでは、同じこずが次のように曞かれたす。

mydir=$(pwd)

そしお、スクリプトは次のようになりたす。

#!/bin/bash
mydir=$(pwd)
echo $mydir

動䜜䞭、コマンドの出力は pwd倉数に保存されたす mydir、コマンドを䜿甚しおその内容を確認したす echo, コン゜ヌルに移動したす。

Bash スクリプト: 始たり
コマンドの結果を倉数に保存するスクリプト

数孊的挔算

スクリプト ファむルで数孊的挔算を実行するには、次のような構成を䜿甚できたす。 $((a+b)):

#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2

Bash スクリプト: 始たり
スクリプト内の数孊的操䜜

if-then 制埡構造

䞀郚のシナリオでは、コマンド実行のフロヌを制埡する必芁がありたす。 たずえば、特定の倀が XNUMX より倧きい堎合は XNUMX ぀のアクションを実行する必芁があり、それ以倖の堎合は別のアクションを実行する必芁がありたす。 これは倚くの状況に適甚でき、ここでは制埡構造が圹に立ちたす。 if-then。 最も単玔な圢匏では次のようになりたす。

if кПЌаМЎа
then
кПЌаМЎы
fi

以䞋に実際の䟋を瀺したす。

#!/bin/bash
if pwd
then
echo "It works"
fi

この堎合、コマンドを実行するず、 pwd正垞に完了するず、「動䜜したす」ずいうテキストがコン゜ヌルに衚瀺されたす。

これたでの知識を掻甚しお、より耇雑なスクリプトを䜜成しおみたしょう。 特定のナヌザヌを怜玢する必芁があるずしたす。 /etc/passwd、そしおそれを芋぀けるこずができた堎合は、それが存圚するこずを報告しおください。

#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi

このスクリプトを実行するず、次のようになりたす。

Bash スクリプト: 始たり
ナヌザヌ怜玢

ここではコマンドを䜿甚したした grepファむル内のナヌザヌを怜玢するには /etc/passwd。 チヌムなら grepなじみのないものですが、その説明を芋぀けるこずができたす ここで.

この䟋では、ナヌザヌが芋぀かるず、スクリプトは察応するメッセヌゞを衚瀺したす。 ナヌザヌが芋぀からなかったらどうなるでしょうか? この堎合、スクリプトは䜕も通知せずに実行を完了したす。 これに぀いおも圌に教えおもらいたいので、コヌドを改善したす。

if-then-else 制埡構造

プログラムが怜玢の成功ず倱敗の䞡方の結果を報告できるようにするために、次の構造を䜿甚したす。 if-then-else。 仕組みは次のずおりです。

if кПЌаМЎа
then
кПЌаМЎы
else
кПЌаМЎы
fi

最初のコマンドがれロを返した堎合、぀たりコマンドが正垞に実行されたこずを意味し、条件は true ずなり、分岐に沿っお実行は続行されたせん。 else。 それ以倖の堎合、倱敗たたは停の結果を瀺すれロ以倖の倀が返された堎合、その埌のコマンドは else.

次のスクリプトを曞いおみたしょう。

#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi

圌の凊刑は無駄になった else.

Bash スクリプト: 始たり
if-then-else 構造を䜿甚したスクリプトの実行

さお、次に進んで、より耇雑な条件に぀いお考えおみたしょう。 XNUMX ぀の条件ではなく耇数の条件をチェックする必芁がある堎合はどうすればよいでしょうか? たずえば、目的のナヌザヌが芋぀かった堎合は XNUMX ぀のメッセヌゞが衚瀺され、他の条件が満たされた堎合は別のメッセヌゞが衚瀺されたす。 このような状況では、ネストされた条件が圹に立ちたす。 次のようになりたす。

if кПЌаМЎа1
then
кПЌаМЎы
elif кПЌаМЎа2
then
кПЌаМЎы
fi

最初のコマンドが実行に成功したこずを瀺すれロを返した堎合、最初のブロック内のコマンドが実行されたす。 thenそうでない堎合、最初の条件が false で XNUMX 番目のコマンドが XNUMX を返した堎合、コヌドの XNUMX 番目のブロックが実行されたす。

#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
elif ls /home
then
echo "The user doesn’t exist but anyway there is a directory under /home"
fi

このようなスクリプトでは、たずえば、次のコマンドを䜿甚しお新しいナヌザヌを䜜成できたす。 useradd、怜玢で結果が埗られなかった堎合、たたは他の圹立぀こずを実行したす。

数倀の比范

スクリプトでは数倀を比范できたす。 以䞋は関連するコマンドのリストです。

n1 -eq n2次の堎合に true を返したす n1 等しい n2.
n1 -ge n2 次の堎合に true を返したす n1それ以䞊か同等 n2.
n1 -gt n2次の堎合に true を返したす n1 бПльше n2.
n1 -le n2次の堎合に true を返したす n1それ以䞋か等しい n2.
n1 -lt n2n1 が以䞋の堎合に true を返したす。 n2.
n1 -ne n2次の堎合に true を返したす n1等しくない n2.

䟋ずしお、比范挔算子の XNUMX ぀を詊しおみたしょう。 匏は角括匧で囲たれおいるこずに泚意しおください。

#!/bin/bash
val1=6
if [ $val1 -gt 5 ]
then
echo "The test value $val1 is greater than 5"
else
echo "The test value $val1 is not greater than 5"
fi

これがこのコマンドが出力する内容です。

Bash スクリプト: 始たり
スクリプト内の数倀の比范

倉数倀 val15 より倧きい堎合、ブランチは実行されおしたいたす then比范挔算子が衚瀺され、察応するメッセヌゞがコン゜ヌルに衚瀺されたす。

文字列比范

スクリプトは文字列倀を比范するこずもできたす。 比范挔算子は非垞に単玔に芋えたすが、文字列比范挔算には特定の機胜があり、それに぀いおは埌で觊れたす。 こちらが挔算子の䞀芧です。

str1 = str2 文字列が等しいかどうかをテストし、文字列が同䞀の堎合は true を返したす。
str1 != str2文字列が同䞀でない堎合は true を返したす。
str1 < str2次の堎合に true を返したす str1未満 str2.
str1 > str2 次の堎合に true を返したす str1以䞊 str2.
-n str1 長さの堎合は true を返したす str1れロ以䞊の。
-z str1長さの堎合は true を返したす str1れロに等しい。

スクリプト内の文字列を比范する䟋を次に瀺したす。

#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user  is the current logged in user"
fi

スクリプトを実行した結果、次の結果が埗られたす。

Bash スクリプト: 始たり
スクリプト内の文字列の比范

ここで、蚀及する䟡倀のある文字列比范の機胜を XNUMX ぀玹介したす。 ぀たり、「>」および「<」挔算子はバックスラッシュで゚スケヌプする必芁がありたす。そうしないず、゚ラヌ メッセヌゞは衚瀺されたせんが、スクリプトは正しく動䜜したせん。 スクリプトは、「>」蚘号を出力リダむレクト コマンドずしお解釈したす。

これらの挔算子をコヌドで操䜜するず次のようになりたす。

#!/bin/bash
val1=text
val2="another text"
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

スクリプトの結果は次のずおりです。

Bash スクリプト: 始たり
文字列比范、譊告が衚瀺される

スクリプトは実行されたすが、譊告が発行されるこずに泚意しおください。

./myscript: line 5: [: too many arguments

この譊告を取り陀くには、次のように結論付けたす。 $val2 二重匕甚笊で囲みたす:

#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

これで、すべおが正垞に機胜したす。

Bash スクリプト: 始たり
文字列比范

「>」および「<」挔算子のもう XNUMX ぀の特城は、倧文字ず小文字の凊理方法です。 この機胜を理解するために、次の内容のテキスト ファむルを準備しおみたしょう。

Likegeeks
likegeeks

名前を付けお保存したしょう myfile、タヌミナルで次のコマンドを実行したす。

sort myfile

次のようにファむルの行を䞊べ替えたす。

likegeeks
Likegeeks

チヌム sortはデフォルトで文字列を昇順に䞊べ替えたす。぀たり、この䟋では小文字が倧文字よりも小さくなりたす。 次に、同じ文字列を比范するスクリプトを準備したしょう。

#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

これを実行するず、すべおが逆であるこずがわかりたす。小文字が倧文字よりも倧きくなりたした。

Bash スクリプト: 始たり
sort コマンドずスクリプト ファむル内の文字列の比范

比范コマンドでは、倧文字は小文字よりも小さくなりたす。 ここでの文字列比范は、文字の ASCII コヌドを比范するこずによっお行われるため、゜ヌト順序は文字コヌドに䟝存したす。

チヌム sortでは、システム蚀語蚭定で指定された䞊べ替え順序が䜿甚されたす。

ファむルチェック

おそらく、次のコマンドが bash スクリプトで最も頻繁に䜿甚されたす。 ファむルに関するさたざたな条件を確認できたす。 これらのコマンドのリストを次に瀺したす。

-d fileファむルが存圚し、ディレクトリであるかどうかを確認したす。
-e fileファむルが存圚するかどうかを確認したす。
-f file ファむルが存圚するかどうか、ファむルであるかどうかを確認したす。
-r fileファむルが存圚し、読み取り可胜であるかどうかを確認したす。
-s file Пファむルが存圚し、空でないかどうかを確認したす。
-w fileファむルが存圚し、曞き蟌み可胜かどうかを確認したす。
-x fileファむルが存圚し、実行可胜であるかどうかを確認したす。
file1 -nt file2 新しいかどうかを確認したす file1より file2.
file1 -ot file2叀いかどうかを確認したす file1より file2.
-O file ファむルが存圚し、珟圚のナヌザヌが所有しおいるかどうかを確認したす。
-G fileファむルが存圚するかどうか、およびそのグルヌプ ID が珟圚のナヌザヌのグルヌプ ID ず䞀臎するかどうかを確認したす。

これらのコマンドは、今日説明した他の倚くのコマンドず同様に、芚えやすいものです。 それらの名前は、さたざたな単語の省略圢であり、実行するチェックを盎接瀺しおいたす。

実際にコマンドの XNUMX ぀を詊しおみたしょう。

#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]
then
echo "The $mydir directory exists"
cd $ mydir
ls
else
echo "The $mydir directory does not exist"
fi

このスクリプトは、既存のディレクトリに察しおその内容を衚瀺したす。

Bash スクリプト: 始たり
ディレクトリの内容を䞀芧衚瀺する

残りのコマンドはすべお同じ原則に埓っお䜿甚されるため、ご自身で詊しおいただけるず思いたす。

結果

今日は、bash スクリプトの䜜成を開始する方法に぀いお説明し、いく぀かの基本的な事項に぀いお説明したした。 実際、bash プログラミングのトピックは非垞に倧きなものになっおいたす。 この蚘事は、11 の資料からなる倧芏暡なシリヌズの最初の郚分の翻蚳です。 今すぐ続行したい堎合は、これらの資料のオリゞナルのリストを次に瀺したす。 䟿宜䞊、今読んだ翻蚳をここに掲茉したす。

  1. Bash スクリプトのステップバむステップ — ここでは、bash スクリプトの䜜成を開始する方法、倉数の䜿甚方法、条件構造、蚈算、数倀や文字列の比范、ファむルに関する情報の怜玢に぀いお説明したす。
  2. Bash スクリプト パヌト 2、玠晎らしい Bash — ここでは、for ルヌプず while ルヌプを䜿甚する機胜が明らかになりたす。
  3. Bash スクリプト パヌト 3、パラメヌタずオプション — この資料は、ナヌザヌが入力したデヌタやファむルから読み取るこずができるデヌタを凊理する、スクリプトに枡すこずができるコマンド ラむン パラメヌタヌずキヌに特化しおいたす。
  4. Bash スクリプト パヌト 4、入力ず出力 - ここでは、ファむル蚘述子ずその操䜜、入力、出力、゚ラヌ ストリヌム、および出力リダむレクトに぀いお説明したす。
  5. Bash スクリプト パヌト 5、シガヌルずゞョブ — この資料は、Linux シグナル、スクリプトでのその凊理、およびスケゞュヌルに基づいたスクリプトの起動に特化しおいたす。
  6. Bash スクリプト パヌト 6、関数 — ここでは、スクリプトでの関数の䜜成ず䜿甚、およびラむブラリの開発に぀いお孊ぶこずができたす。
  7. Bash スクリプト パヌト 7、sed の䜿甚 — この蚘事は、sed ストリヌミング テキスト ゚ディタヌの操䜜に特化しおいたす。
  8. Bash スクリプト パヌト 8、awk の䜿甚 — この資料は、awk デヌタ凊理蚀語でのプログラミングに特化しおいたす。
  9. Bash スクリプト パヌト 9、正芏衚珟 — ここでは、bash スクリプトでの正芏衚珟の䜿甚に぀いお読むこずができたす。
  10. Bash スクリプト パヌト 10、実践䟋 — ここでは、ナヌザヌに送信できるメッセヌゞを操䜜するためのテクニックず、ディスクを監芖するための方法を玹介したす。
  11. Bash スクリプト パヌト 11、Expect コマンド — この資料は、察話型ナヌティリティずの察話を自動化できる Expect ツヌル専甚です。 特に、期埅スクリプトず、それらの bash スクリプトや他のプログラムずの盞互䜜甚に぀いお話したす。

このシリヌズの蚘事の貎重な特城の XNUMX ぀は、あらゆるレベルのナヌザヌに適した最も単玔なものから始めお、埐々に非垞に深刻なトピックに぀ながり、誰もが Linux コマンド ラむン スクリプトの䜜成を進める機䌚を提䟛できるこずであるず考えおいたす。 。

芪愛なる読者の皆様 私たちは、bash プログラミングの達人たちに、どのようにしお熟緎の高みに到達したのか、その秘密を共有しおもらいたす。たた、初めおスクリプトを曞いたばかりの人たちからの感想もお埅ちしおいたす。

Bash スクリプト: 始たり

登録ナヌザヌのみがアンケヌトに参加できたす。 ログむンお願いしたす。

䞀連の蚘事の残りを翻蚳する必芁がありたすか?

  • うん

  • いいえ、必芁ありたせん

1030 人のナヌザヌが投祚したした。 106名のナヌザヌが棄暩した。

出所 habr.com

コメントを远加したす