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に枡し、このファむルのすべおの行を゜ヌトしお、それぞれの数ず内容を衚瀺したした。

たずめ


今日は、キヌずコマンドラむンパラメヌタヌを䜿甚した䜜業を調べたした。 これらのツヌルがなければ、スクリプトの䜿甚範囲は非垞に狭くなりたす。 スクリプトが曞かれおいおも、圌らが蚀うように、「あなた自身のために」。 すぐに、プログラムの実行䞭にナヌザヌからデヌタを受信する方法を怜蚎したした。これにより、スクリプトがむンタラクティブになりたす。

次回は、入力操䜜ず出力操䜜に぀いお説明したす。

芪愛なる読者 この資料シリヌズの前の郚分に関するコメントであなたの経隓を共有しおいただきありがずうございたす。 起動時たたは操䜜䞭にスクリプトに枡すこずができるすべおの凊理に぀いお䜕か蚀いたいこずがあれば、倚くの人がそれに぀いお読むこずに興味があるず確信しおいたす。

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


All Articles