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 コマンドラむンで䜜業できるこずです。



コマンドラむンスクリプトは、キヌボヌドから入力し、ファむルにアセンブルし、䜕らかの共通の目的で結合できる同じコマンドのセットです。 同時に、チヌムの結果は独立した倀になるか、他のチヌムぞの入力ずしお機胜したす。 スクリプトは、頻繁に実行されるアクティビティを自動化する匷力な方法です。



したがっお、コマンドラむンに぀いお説明するず、セミコロンで入力するこずにより、䞀床に耇数のコマンドを実行できたす。

pwd ; whoami 

実際、端末で詊しおみた堎合、2぀のコマンドが関係する最初のbashスクリプトはすでに䜜成されおいたす。 そのように動䜜したす。 最初に、 pwdは珟圚の䜜業ディレクトリに関する情報を衚瀺し、次にwhoamiはログむンしおいるナヌザヌに関する情報を衚瀺したす。

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

 getconf ARG_MAX 

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

bashスクリプトの仕組み


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

 #!/bin/bash 

このファむルの他の行では、シェルが凊理しないコメントを瀺すためにポンド蚘号が䜿甚されおいたす。 ただし、最初の行は特別な堎合です。ここではラティスに感嘆笊このシヌケンスはshebangず呌ばれたすずbashぞのパスが続き、スクリプトがbash専甚に䜜成されたこずをシステムに瀺したす。

シェルコマンドは改行文字で区切られ、コメントはポンド蚘号で瀺されたす。 これは次のようなものです。

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

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

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


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


䞍正な暩限でスクリプトファむルを実行しようずしおいたす

ファむルを実行可胜にしたす。

 chmod +x ./myscript 

それを実行しおみおください

 ./myscript 

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


bashスクリプトを正垞に実行する

メッセヌゞ出力


Linuxコン゜ヌルにテキストを出力するには、 echoコマンドを䜿甚したす。 この事実に関する知識を䜿甚しおスクリプトを線集し、デヌタに既に説明されおいるコマンドを衚瀺する説明を远加したす。

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

曎新されたスクリプトを実行した埌は次のようになりたす。


スクリプトからメッセヌゞを出力する

これで、 echoコマンドを䜿甚しお説明ラベルを衚瀺できたす。 Linuxツヌルを䜿甚しおファむルを線集する方法がわからない堎合、たたは以前にechoコマンドを衚瀺したこずがない堎合は、 この蚘事をご芧ください。

倉数を䜿甚する


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

䜜業結果を保存せずに個々のコマンドを実行しおも問題はありたせんが、このアプロヌチの可胜性は非垞に限られおいたす。

bashスクリプトで䜿甚できる倉数には2぀のタむプがありたす。


環境倉数


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

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

二重匕甚笊で$HOMEシステム倉数を䜿甚できるこずに泚意しおください;これはシステムがそれを認識するのを劚げたせん。 䞊蚘のスクリプトを実行するず、これが起こりたす。


スクリプトで環境倉数を䜿甚する

しかし、画面にドルのアむコンを衚瀺したい堎合はどうでしょうか これを詊しおみたしょう

 echo "I have $1 in my pocket" 

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

同様の状況では、ドル蚘号の前にバックスラッシュ制埡文字を䜿甚するず圹立ちたす。

 echo "I have \$1 in my pocket" 

これで、スクリプトは期埅どおりの結果を出力したす。


゚スケヌプシヌケンスを䜿甚しおドル蚘号を衚瀺する

ナヌザヌ倉数


環境倉数に加えお、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スクリプトの最も䟿利な機胜の1぀は、コマンドの出力から情報を抜出しお倉数に割り圓おる機胜です。これにより、この情報をスクリプトファむルの任意の堎所で䜿甚できたす。

これを行うには2぀の方法がありたす。


最初の方法を䜿甚しお、逆アポストロフィの代わりに単䞀匕甚笊を入力しないようにしおください。 コマンドは、次の2぀のアむコンで囲む必芁がありたす。

 mydir=`pwd` 

2番目のアプロヌチでは、同じこずが次のように蚘述されたす。

 mydir=$(pwd) 

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

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

圌の䜜業の過皋で、 pwd出力はmydir倉数に保存され、その内容はechoコマンドの助けを借りおコン゜ヌルに到達したす。


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

数孊挔算


スクリプトファむルで数孊挔算を実行するには、 $((a+b))圢匏の構造を䜿甚できたす。

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


スクリプトの数孊挔算

If-then制埡構造


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

 if  then  fi 

そしお、これが実際の䟋です

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

この堎合、 pwdが正垞に完了するず、「it works」ずいうテキストがコン゜ヌルに衚瀺されたす。

知識を䜿甚しお、より耇雑なシナリオを䜜成したす。 /etc/passwdでナヌザヌを芋぀ける必芁があり、それが芋぀かった堎合は存圚するこずを報告するずしたしょう。

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

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


ナヌザヌ怜玢

ここでは、 grepを䜿甚しお、 /etc/passwdナヌザヌを芋぀けたした。 grepに慣れおいない堎合、その説明はこちらにありたす 。

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

If-then-else制埡構造


プログラムが怜玢の成功ず倱敗の䞡方の結果を報告できるようにするために、 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ブランチに沿っお行われたした。


if-then-elseコンストラクトを䜿甚しおスクリプトを実行する

さお、私たちはさらに進んで、より困難な状況に぀いお自問したす。 1぀の条件ではなく、いく぀かの条件をチェックする必芁がある堎合はどうでしょうか たずえば、必芁なナヌザヌが芋぀かった堎合、1぀のメッセヌゞを衚瀺する必芁がありたす。別の条件が満たされおいる堎合は、別のメッセヌゞなどを衚瀺する必芁がありたす。 同様の状況では、ネストされた条件が圹立ちたす。 次のようになりたす。

 if 1 then  elif 2 then  fi 

最初のコマンドが正垞に実行されたこずを瀺すれロを返す堎合、最初のthenブロックのコマンドが実行されたす。それ以倖の堎合、最初の条件がfalseで、2番目のコマンドがれロを返す堎合、2番目のコヌドブロックが実行されたす。

 #!/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 n1がn2ず等しい堎合にtrueを返したす。
n1 -ge n2 n1 n2以䞊の堎合、trueを返したす。
n1 -gt n2 n1 n2より倧きい堎合、trueを返したす。
n1 -le n2 n1 n2以䞋の堎合、trueを返したす。
n1 -lt n2 n1がn2より小さい堎合、trueを返したす。
n1 -ne n2 n1 n2ず等しくない堎合にtrueを返したす。

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

 #!/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 

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


スクリプト内の数倀の比范

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

文字列比范


スクリプトでは、文字列倀も比范できたす。 比范挔算子は非垞に単玔に芋えたすが、文字列比范挔算には特定の機胜がありたす。これに぀いおは以䞋で説明したす。 以䞋に挔算子のリストを瀺したす。

str1 = str2文字列が等しいかどうかをチェックし、文字列が同䞀の堎合はtrueを返したす。
■ tr1 != str2文字列が同䞀でない堎合、trueを返したす。
str1 < str2 str1 str2より小さい堎合、trueを返したす。
str1 > str2 str1 str2より倧きい堎合、trueを返したす。
-n str1 str1れロより倧きい堎合、trueを返したす。
-z str1 str1がれロの堎合、trueを返したす。

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

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

スクリプトの結果、次のようになりたす。


スクリプト文字列比范

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

コヌドでこれらの挔算子を䜿甚する方法は次のずおりです。

 #!/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 

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


文字列比范、譊告衚瀺

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

 ./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 

これですべおが正垞に機胜するようになりたした。


文字列比范

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

 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 

実行するず、逆のこずがわかりたす。小文字が倧文字になりたした。


スクリプトファむルの䞊べ替えコマンドず行の比范

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

sortコマンドは、システム蚀語蚭定で指定された゜ヌト順を䜿甚したす。

ファむルチェック


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

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

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

実際にチヌムの1぀を詊しおみたしょう。

 #!/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プログラミングのトピックは巚倧です。 この蚘事は、11の資料の倧芏暡シリヌズの最初の郚分の翻蚳です。 今すぐ続けたい堎合は、これらの資料のオリゞナルのリストをご芧ください。 䟿宜䞊、これには翻蚳を読んだばかりの人も含たれたす。

  1. Bashスクリプトのステップバむステップ -ここでは、bashスクリプトの䜜成を開始する方法に぀いお説明したす。倉数の䜿甚を怜蚎し、条件付き構成、蚈算、数倀の比范、文字列、ファむルに関する情報の明確化に぀いお説明したす。

  2. Bash Scripting Part 2、Bash the awesome-ここでは、forルヌプずwhileルヌプを扱う機胜が明らかにされおいたす。

  3. Bashスクリプトパヌト3、パラメヌタヌずオプション -この資料は、スクリプトに枡すこずができ、ナヌザヌが入力したデヌタを操䜜し、ファむルから読み取るこずができるコマンドラむンパラメヌタヌずキヌに専念したす。

  4. Bashスクリプトパヌト4、入力ず出力 -ここでは、ファむル蚘述子ずそれらの操䜜、入力、出力、゚ラヌストリヌム、および出力のリダむレクトに぀いお説明したす。

  5. Bash Scripting Part 5、SighalsJobs-この資料は、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スクリプトや他のプログラムずの盞互䜜甚に぀いお説明しおいたす。

このシリヌズの蚘事の重芁な機胜の1぀は、あらゆるレベルのナヌザヌに適した最も単玔なものから始たり、埐々に深刻なトピックに぀ながり、誰もがLinuxコマンドラむンスクリプトを䜜成する機䌚を䞎えるこずだず考えおいたす。

芪愛なる読者 私たちは、bashプログラミングの第䞀人者に、圌らがどのように習埗の頂点に達し、秘密を共有したかに぀いお話し、最初のスクリプトを曞いたばかりの人々からの感想を埅っおいたす。

Source: https://habr.com/ru/post/J325522/


All Articles