Bashスクリプト、パート3:オプションとコマンドラインスイッチ

Bashスクリプト:開始

Bashスクリプト、パート2:ループ

Bashスクリプト、パート3:オプションとコマンドラインスイッチ

Bashスクリプト、パート4:入力と出力

Bashスクリプト、パート5:シグナル、バックグラウンドタスク、スクリプト管理

Bashスクリプト、パート6:関数とライブラリーの開発

Bashスクリプト、パート7:sedとワープロ

Bashスクリプト、パート8:awkデータ処理言語

Bashスクリプトパート9:正規表現

Bashスクリプト、パート10:ケーススタディ

Bashスクリプト、パート11:対話型ユーティリティの期待と自動化


この一連の資料の前の部分を習得したので、bashスクリプトとは何か、それらを記述する方法、プログラムフローを制御する方法、ファイルを操作する方法について学びました。 今日は、スクリプトに対話性を追加し、ユーザーからデータを受信して​​このデータを処理する機能をスクリプトに追加する方法について説明します。



画像







データをスクリプトに渡す最も一般的な方法は、コマンドラインオプションを使用することです。 パラメーターを指定してスクリプトを呼び出すことで、彼にそれが機能するための情報を渡します。 次のようになります。



$ ./myscript 10 20
      
      





この例では、スクリプトは2つのパラメーター「10」と「20」を渡しました。 これはすべて良いことですが、スクリプト内のデータを読み取る方法は?



コマンドラインオプションの読み取り



bashシェルは、スクリプトが呼び出されたときに入力されたコマンドラインパラメーターに、位置パラメーターと呼ばれる特別な変数を割り当てます。





これらの変数を使用して、スクリプトでコマンドラインオプションを使用する方法は次のとおりです。



 #!/bin/bash echo $0 echo $1 echo $2 echo $3
      
      





パラメーターを指定してスクリプトを実行します。



 ./myscript 5 10 15
      
      





これは、コンソールに出力されるものです。









スクリプトの実行に使用される出力パラメーター



コマンドラインオプションはスペースで区切られていることに注意してください。



パラメータを使用する別の例を見てみましょう。 ここで、スクリプトに渡された数値の合計を見つけます。



 #!/bin/bash total=$[ $1 + $2 ] echo The first parameter is $1. echo The second parameter is $2. echo The sum is $total.
      
      





スクリプトを実行し、計算の結果を確認します。









渡された数値の合計を見つけるスクリプト



コマンドラインオプションは数字である必要はありません。 スクリプトは文字列を渡すこともできます。 たとえば、文字列を処理するスクリプトは次のとおりです。



 #!/bin/bash echo Hello $1, how do you do
      
      





実行してください:



 ./myscript Adam
      
      





彼は私たちが彼に期待することを推測します。









文字列パラメーターを使用するスクリプト



パラメータにスペースが含まれていて、独立したデータとして処理する必要がある場合はどうなりますか? このガイドの前の部分を習得していれば、答えはすでにわかっていると思います。 引用符の使用で構成されます。



スクリプトが9つ以上のパラメーターを必要とする場合、それらにアクセスするときは、変数名の数字を中括弧で囲む必要があります。次に例を示します。



 ${10}
      
      





パラメータの検証



スクリプトがパラメーターなしで呼び出されたが、コードの通常の操作ではそれらが存在すると想定される場合、エラーが発生します。 したがって、呼び出し時にスクリプトに渡されるパラメーターを常に確認することをお勧めします。 たとえば、これは次のように編成できます。



 #!/bin/bash if [ -n "$1" ] then echo Hello $1. else echo "No parameters found. " fi
      
      





最初にパラメーターを指定してスクリプトを呼び出し、次にパラメーターを指定せずに呼び出します。









コマンドラインパラメータをチェックするスクリプトを呼び出す



パラメータカウント



スクリプトでは、渡されたパラメーターの数を計算できます。 bashシェルは、このための特別な変数を提供します。 つまり、変数$#



は、呼び出し時にスクリプトに渡されるパラメーターの数が含まれます。



テストしてみましょう:



 #!/bin/bash echo There were $# parameters passed.
      
      





スクリプトを呼び出します。



 ./myscript 1 2 3 4 5
      
      





その結果、スクリプトは5つのパラメーターが渡されたことを報告します。









スクリプト内のパラメーターの数を数える



この変数は、番号を知らなくてもスクリプトに渡される最後のパラメーターを取得する異常な方法を提供します。 これは次のようなものです。



 #!/bin/bash echo The last parameter was ${!#}
      
      





スクリプトを呼び出して、何が表示されるかを確認します。









最後のパラメーターへのアクセス



すべてのコマンドラインオプションをキャプチャする



場合によっては、スクリプトに渡されるすべてのパラメーターをキャプチャする必要があります。 これには変数$*



$@



使用できます。 どちらにもコマンドラインパラメーターがすべて含まれているため、位置パラメーターを使用せずにスクリプトに渡されたものにアクセスできます。



$*



変数には、コマンドラインで入力されたすべてのパラメーターが単一の「単語」として含まれています。



変数$@



パラメーターは個別の「単語」に分割されます。 これらのパラメーターは、サイクルごとにソートできます。



例のこれらの変数の違いを考慮してください。 まず、その内容を見てみましょう:



 #!/bin/bash echo "Using the \$* method: $*" echo "-----------" echo "Using the \$@ method: $@"
      
      





スクリプト出力は次のとおりです。









$ *および$ @変数



ご覧のとおり、両方の変数の出力は同じです。 次に、これらの変数の違いを確認するために、これらの変数の内容をサイクルで調べてみましょう。



 #!/bin/bash count=1 for param in "$*" do echo "\$* Parameter #$count = $param" count=$(( $count + 1 )) done count=1 for param in "$@" do echo "\$@ Parameter #$count = $param" count=$(( $count + 1 )) done
      
      





コンソールでスクリプトが印刷した内容を見てください。 変数の違いは明らかです。









ループ内の$ *および$ @変数の解析



$*



変数には、単一のデータとしてスクリプトに渡されるすべてのパラメーターが含まれますが、 $@



変数では、独立した値で表されます。 どの変数を使用するかは、特定のシナリオで正確に必要なものによって異なります。



シフトコマンド



bashスクリプトでは、単語の文字通りの意味で位置パラメーターの値をshift



するため、 shift



コマンドは注意して使用してください。



このコマンドを使用すると、デフォルトで、位置パラメータの値が左にシフトします。 たとえば、変数$3



の値は変数$2



の値になり、 $2



の値は$1



になり、 $1,



前の値は失われます。 スクリプト名を含む変数$0



値は変更されないことに注意してください。



shift



コマンドを使用して、スクリプトに渡されたパラメーターを反復処理する別の方法を検討します。



 #!/bin/bash count=1 while [ -n "$1" ] do echo "Parameter #$count = $1" count=$(( $count + 1 )) shift done
      
      





スクリプトは、 while



アクティブにwhile



、最初のパラメーターの値の長さを確認します。 長さがゼロになると、ループは終了します。 最初のパラメーターを確認して画面に表示した後、 shift



コマンドが呼び出され、パラメーター値が1ポジションだけシフトされます。









shiftコマンドを使用してパラメーターを反復処理する



shift



コマンドを使用すると、呼び出されるたびに、変数$1



$1



回復不能に失わ$1



注意してください。



コマンドラインスイッチ



コマンドラインスイッチは通常、ダッシュが前に付いた文字のように見えます。 スクリプトの管理に使用されます。 この例を考えてみましょう:



 #!/bin/bash echo while [ -n "$1" ] do case "$1" in -a) echo "Found the -a option" ;; -b) echo "Found the -b option" ;; -c) echo "Found the -c option" ;; *) echo "$1 is not an option" ;; esac shift done
      
      





スクリプトを実行します。



 $ ./myscript –a –b –c –d
      
      





そして、それがターミナルに出力するものを分析します。









スクリプトでのキー処理



このコードでは、スクリプトによって処理されたキーのリストを使用して渡されたキーをチェックするcase



コンストラクトが使用されます。 渡された値がこのリストで見つかった場合、対応するコードブランチが実行されます。 スクリプトを呼び出すときに、処理用に提供されていないキーが使用されると、「*」ブランチが実行されます。



キーとパラメーターを区別する方法



多くの場合、bashスクリプトを記述するときに、コマンドラインパラメーターとキーの両方を使用する必要がある場合に状況が発生します。 これを行う標準的な方法は、キーが終了して通常のパラメータが開始するタイミングをスクリプトに伝える特殊文字シーケンスを使用することです。



このシーケンスは二重ダッシュ(-)です。 シェルはこれを使用して、キーリストが終了する位置を示します。 スクリプトがキーの終わりの兆候を検出した後、残っているものは、エラーを恐れることなく、キーとしてではなくパラメーターとして処理できます。 例を考えてみましょう:



 #!/bin/bash while [ -n "$1" ] do case "$1" in -a) echo "Found the -a option" ;; -b) echo "Found the -b option";; -c) echo "Found the -c option" ;; --) shift break ;; *) echo "$1 is not an option";; esac shift done count=1 for param in $@ do echo "Parameter #$count: $param" count=$(( $count + 1 )) done
      
      





このスクリプトは、 break



コマンドを使用して、二重ダッシュに遭遇したときにwhile



を終了while







これは彼の電話の後に起こることです。









キーとコマンドラインオプションの処理



ご覧のように、渡されたデータを解析するスクリプトが二重ダッシュを見つけると、キーの処理が完了し、パラメータとして処理されていないすべてのものが考慮されます。



値を使用したキー処理



スクリプトがより複雑になると、通常のキーでは不十分な状況が発生します。つまり、特定の値を持つキーを使用する必要があります。 たとえば、この機能を使用するスクリプトを呼び出すと、次のようになります。



 ./myscript -a test1 -b -c test2
      
      





スクリプトは、追加のパラメーターがコマンドラインスイッチと共に使用されるタイミングを判断できる必要があります。



 #!/bin/bash while [ -n "$1" ] do case "$1" in -a) echo "Found the -a option";; -b) param="$2" echo "Found the -b option, with parameter value $param" shift ;; -c) echo "Found the -c option";; --) shift break ;; *) echo "$1 is not an option";; esac shift done count=1 for param in "$@" do echo "Parameter #$count: $param" count=$(( $count + 1 )) done
      
      





このスクリプトを次の形式で呼び出します。



 ./myscript -a -b test1 -d
      
      





彼の仕事の結果を見てみましょう。









キーパラメーター処理



この例では、 case



構造で3つのキーが処理されます。 -b



スイッチには追加のパラメーターが必要です。 処理されるキーは変数$1



にあるため、対応するパラメーターは$2



なります( shift



コマンドがここで使用されるため、処理されると、スクリプトに転送されるすべてが左にシフトします)。 これを理解すると、変数$2



値を抽出するだけで、目的のキーのパラメーターが得られます。 もちろん、次のキーが$1



押すために、もう1つのshift



コマンドが必要です。



標準キーを使用する



bashスクリプトを作成するときは、コマンドラインキーに任意の文字を選択し、これらのキーに対するスクリプトの反応を任意に設定できます。 ただし、Linuxの世界では、一部のキーの意味は、準拠するのに役立つ標準的なものになっています。 これらのキーのリストは次のとおりです。



-a



すべてのオブジェクトをリストします。

-c



カウントを実行します。

-d



ディレクトリを指定します。

-e



オブジェクトを展開します。

-f



データを読み込むファイルを指定します。

-h



コマンドのヘルプを出力します。

-i



文字の大文字と小文字を区別しません。

-l



フルフォーマットのデータ出力を実行します。

-n



非対話型(バッチ)モードを使用します。

-o



出力のリダイレクト先のファイルを指定します。

-q



クワイエットモードでスクリプトを実行します。

-r



フォルダーとファイルを再帰的に処理します。

-s



スクリプトをサイレントモードで実行します。

-v



詳細出力を実行します。

-x



オブジェクトを除外します。

-y



すべての質問にyesと答えます。


Linuxで作業している場合、これらのキーの多くに精通している可能性があります。 スクリプトで常識的にそれらを使用すると、ドキュメントを読むことを心配することなく、ユーザーがそれらと対話できるようになります。



ユーザーからデータを受信する



キーとコマンドラインオプションは、スクリプトを使用するユーザーからデータを取得するための優れた方法ですが、場合によっては、より多くの対話性が必要です。



スクリプトには、プログラムの実行中にユーザーが入力する必要があるデータが必要な場合があります。 この目的のために、bashシェルにread



コマンドがあります。



このコマンドを使用すると、標準入力(キーボードから)または他のファイル記述子を使用して入力を受け入れることができます。 データを受け取った後、このコマンドはそれらを変数に入れます:



 #!/bin/bash echo -n "Enter your name: " read name echo "Hello $name, welcome to my program."
      
      





プロンプトを発行するecho



コマンドが-n



スイッチで呼び出されることに注意してください。 これにより、招待状の最後に改行文字が表示されないため、スクリプトユーザーは次の行ではなく招待状と同じ場所にデータを入力できます。









ユーザー入力処理



read



呼び出すread



いくつかの変数を指定できます。



 #!/bin/bash read -p "Enter your name: " first last echo "Your data for $last, $first…"
      
      





これは、スクリプトが開始後に出力するものです。









読み取りコマンドのいくつかの変数



read



を呼び出して変数を指定しない場合、ユーザーが入力したデータは特別なREPLY



環境変数に配置されます。



 #!/bin/bash read -p "Enter your name: " echo Hello $REPLY, welcome to my program.
      
      











REPLY環境変数の使用



ユーザーがデータを入力したかどうかに関係なくスクリプトを実行し続ける必要がある場合、 read



コマンドを呼び出すと-t



スイッチを使用できます。 つまり、キーパラメータは入力のタイムアウトを秒単位で設定します。



 #!/bin/bash if read -t 5 -p "Enter your name: " name then echo "Hello $name, welcome to my script" else echo "Sorry, too slow! " fi
      
      





5秒以内にデータが入力されない場合、スクリプトは条件付きelse



ブランチを実行し、謝罪を表示します。









データ入力の制限時間



パスワード入力



スクリプトの質問に対してユーザーが入力した内容を表示しないほうがよい場合があります。 たとえば、これは通常、パスワードを要求することによって行われます。 read



コマンドの-s



は、キーボードデータが画面に表示されないようにします。 実際には、データは出力されますが、 read



コマンドはテキストの色を背景色と同じにします。



 #!/bin/bash read -s -p "Enter your password: " pass echo "Is your password really $pass? "
      
      





これがこのスクリプトの仕組みです。









機密データ入力



ファイルからデータを読み取る



read



コマンドは、呼び出しごとに、ファイルから1行のテキストを読み取ることができます。 ファイルに未読の行がなくなると、停止します。 スクリプトでファイルの内容全体を取得する場合、パイプラインを使用して、ファイルのcat



の呼び出しの結果を転送できます。 while



read



コマンドを含むコンストラクト(もちろん、 cat



使用はプリミティブに見えますが、私たちの目標は、初心者、経験豊富なユーザーは必ず理解してください)。



ファイルを読み取るために今説明したアプローチを使用するスクリプトを書きましょう。



 #!/bin/bash count=1 cat myfile | while read line do echo "Line $count: $line" count=$(( $count + 1 )) done echo "Finished"
      
      





動作中の彼を見てみましょう。









ファイルからデータを読み取る



ここでは、ファイルの内容をwhile



に渡し、このファイルのすべての行をソートして、それぞれの数と内容を表示しました。



まとめ



今日は、キーとコマンドラインパラメーターを使用した作業を調べました。 これらのツールがなければ、スクリプトの使用範囲は非常に狭くなります。 スクリプトが書かれていても、彼らが言うように、「あなた自身のために」。 すぐに、プログラムの実行中にユーザーからデータを受信する方法を検討しました。これにより、スクリプトがインタラクティブになります。



次回は、入力操作と出力操作について説明します。



親愛なる読者! この資料シリーズの前の部分に関するコメントであなたの経験を共有していただきありがとうございます。 起動時または操作中にスクリプトに渡すことができるすべての処理について何か言いたいことがあれば、多くの人がそれについて読むことに興味があると確信しています。






All Articles