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の資料の大規模シリーズの最初の部分の翻訳です。 今すぐ続けたい場合は、これらの資料のオリジナルのリストをご覧ください。 便宜上、これには翻訳を読んだばかりの人も含まれます。
- Bashスクリプトのステップバイステップ -ここでは、bashスクリプトの作成を開始する方法について説明します。変数の使用を検討し、条件付き構成、計算、数値の比較、文字列、ファイルに関する情報の明確化について説明します。
- Bash Scripting Part 2、Bash the awesome-ここでは、forループとwhileループを扱う機能が明らかにされています。
- Bashスクリプトパート3、パラメーターとオプション -この資料は、スクリプトに渡すことができ、ユーザーが入力したデータを操作し、ファイルから読み取ることができるコマンドラインパラメーターとキーに専念します。
- Bashスクリプトパート4、入力と出力 -ここでは、ファイル記述子とそれらの操作、入力、出力、エラーストリーム、および出力のリダイレクトについて説明します。
- Bash Scripting Part 5、Sighals&Jobs-この資料は、Linuxシグナル、スクリプトでの処理、およびスケジュールされたスクリプト実行に専念しています。
- Bashスクリプトパート6、関数 -ここでは、スクリプトで関数を作成および使用する方法、ライブラリを開発する方法について学ぶことができます。
- Bashスクリプトパート7、sedの使用 -この記事では、sedストリーミングテキストエディターの操作に焦点を当てています。
- Bashスクリプトパート8、awkの使用 -この資料は、awkデータ処理言語でのプログラミング専用です。
- Bashスクリプトパート9、正規表現 -ここでは、bashスクリプトでの正規表現の使用について読むことができます。
- Bashスクリプトパート10、実用例 -ここでは、ユーザーに送信できるメッセージを操作する方法と、ディスクを監視する方法を示します。
- Bashスクリプトパート11、Expectコマンド -この資料はExpectツール専用です。このツールを使用すると、インタラクティブユーティリティとの対話を自動化できます。 特に、期待されるスクリプトと、bashスクリプトや他のプログラムとの相互作用について説明しています。
このシリーズの記事の重要な機能の1つは、あらゆるレベルのユーザーに適した最も単純なものから始まり、徐々に深刻なトピックにつながり、誰もがLinuxコマンドラインスクリプトを作成する機会を与えることだと考えています。
親愛なる読者! 私たちは、bashプログラミングの第一人者に、彼らがどのように習得の頂点に達し、秘密を共有したかについて話し、最初のスクリプトを書いたばかりの人々からの感想を待っています。