1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

シェルスクリプトのパラメータと相互作用、よくある問題点

2022-01-05 02:52:46

I. シェルプログラミング - スクリプトのパラメータとインタラクション、よくある質問

スクリプトプログラムを実行する際、いくつかのパラメータをスクリプトに渡し、入力されたパラメータ値に基づいて適切なデータを生成したり、特定のロジックを実行したりする必要がある場合があります。

1.1 スクリプトにパラメータを渡す

シェルスクリプトは引数付きで実行することができ、シェルスクリプト内には引数に対応した変数があり、参照することができます。これらの変数には特別な名前がついていて、0、1、2、3...は位置変数と呼ばれます。

ロケーション変数は0から始まり、0変数は実際のスクリプトの名前を保持するために予約され、1変数はスクリプトプログラムの最初の引数に対応し、以下同様である。他の変数と同様に、位置変数の値はシェル内で "$" という記号を使って参照することができます。

[root@localhost 20190105]# vi paral.sh
#! /bin/bash
# show script name
echo 'The script name is '$0
# show the 1st parameter
echo 'The 1st parameter is '$1
#Display the 2nd parameter
echo 'The 2nd parameter is '$2
#Display the 3rd parameter
echo 'The 3rd parameter is '$3
# Display the 4th parameter
echo 'The 4th parameter is '$4
# Display the 5th parameter
echo 'The 5th parameter is '$5
# Display the 6th parameter
echo 'The 6th parameter is '$6
# Display the 7th parameter
echo 'The 7th parameter is '$7
# Display the 8th parameter
echo 'The 8th parameter is '$8
# Display the 9th parameter
echo 'The 9th parameter is '$9
[root@localhost 20190105]# . /paral.sh Ni hao , Nice to meet you !
The script name is . /paral.sh
The 1st parameter is Ni
The 2nd parameter is hao
The 3rd parameter is ,
The 4th parameter is Nice
The 5th parameter is to
The 6th parameter is meet
The 7th parameter is you
The 8th parameter is !
The 9th parameter is //null
[root@localhost 20190105]#


1.2 ユーザーインタラクション

read コマンドを使用して、キーボードからデータを読み取り、指定した変数に代入して、シェルスクリプトでユーザーのデータと対話します。

読み出しコマンドの書式

read variable1 [variable2...]


readコマンドは、ユーザーがデータを入力する際に、スペースやタブで区切って、キーボードから複数の変数の値を読み取るコマンドです。

変数の数と入力されたデータの数が同じ場合は、順番に値が代入されます。

変数の数が入力されたデータの数より多い場合は、左から右の順に割り当てられ、データがない場合は、対応する変数は空になります。

変数の数が入力されたデータの数より少ない場合は、左から右へ割り当てられ、最後の変数に残りのデータがすべて割り当てられます。

read コマンドは、キーボードから入力されたデータを読み込んで変数に保存し、その変数の値を画面に表示し、ユーザーが exit と入力するとプログラムを終了します。

[root@localhost 20190105]# vi read1.sh
#! /bin/bash
# initialize the value of the variable
input1='' # Set input1 variable value to null
input2='' # Set input2 variable to null
input3='' #set input3 variable to null
input4='' #set input4 to null
#until loop, exit the loop when the value of the input1 variable is exit
until [ "$input1" = exit ]
do
       echo 'Please input the values:'
# read input1 input2 input3 input3
       read input1 input2 input3 input4
# Show the data entered by the user on the screen when the input is not exit
       if [ "$input1" ! = exit ]
       then
               echo 'input1: '$input1 # output the value of variable input1
               echo 'input2: '$input2 # output the value of the variable input2
               echo 'input3: '$input3 # output the value of the variable input3
               echo 'input4: '$input4 #output the value of the variable input4
               echo
#Show prompt to exit script when input is exit
       else
               echo 'Exit the script.'
       fi
done
[root@localhost 20190105]# chmod +x read1.sh
[root@localhost 20190105]# . /read1.sh
Please input the values:
How do you do // The number of data entered is equal to the number of variables
input1: How
input2: do
input3: you
input4: do

Please input the values:
Welcome to beijing // The number of data entered is less than the number of variables
input1: Welcome
input2: to
input3: beijing
input4:

Please input the values:
let's go // The number of data entered is less than the number of variables
input1: let's
input2: go
input3:
input4:

Please input the values:
Nice to meet you,too! //The number of data entered is greater than the number of variables
input1: Nice
input2: to
input3: meet
input4: you,too!

Please input the values: //end the program
exit
Exit the script.
[root@localhost 20190105]#



という実行結果を見ることができます。

  • 変数の数が入力されたデータの数より多い場合、データのない変数の値はnullになります。
  • 変数の数が入力されたデータの数より少ない場合、最後の変数に残りのすべてのデータが与えられます。

1.3 特殊な変数

特殊変数と説明

[root@localhost 20190105]# vi vall.sh
#! /bin/bash
echo 'The value of $# is: '$# // output the value of the $# variable
echo 'The value of $* is: '$* // output the value of the $* variable
echo 'The value of $@ is: '$@ //output the value of the $@ variable
echo 'The value of $$ is: '$$ // output the value of $$ variable
echo 'The value of $! is: '$!           //output the value of the $! variable
echo 'The value of $- is: '$- //output the value of the $- variable
echo 'The value of $? is: '$?           //output the value of $? The value of the variable
[root@localhost 20190105]# . /vall.sh how do you do
The value of $# is: 4 //output the value of the 4 variable
The value of $* is: how do you do //output the value of the how do you do variable
The value of $@ is: how do you do // output the value of the how do you do variable
The value of $$ is: 9040 // output the value of the 9040 variable
The value of $! is: //output the value of the variable
The value of $- is: hB //output the value of the hB variable
The value of $? is: 0 // output the value of the 0 variable
[root@localhost 20190105]#


1.4 シェル・プログラミングのよくある質問

1.4.1 コマンドの出力をマスクする方法

Linuxはデフォルトでデバイスファイル/dev/null(空のデバイス)を作成し、そのデバイスへの出力は全てマスクされます。コマンドの出力をデバイス/dev/nullにリダイレクトすることで、コマンドの出力をマスクすることができます。

command > /dev/null


コマンドのエラー出力をマスクする

Command 2> /dev/null


コマンドのエラー出力だけでなく、正常な出力もマスクします。

Command > /dev/null 2> /dev/null


たとえば、シェルコードの中で grep コマンドを使用して、あるキーワードがファイル内に存在するかどうかを調べたいが、grep コマンドの出力をスクリーンに表示したい場合。

if grep jack /etc/passwd > /dev/null
then
 echo "jack found"
fi


etc/passwd ファイルに jack キーワードの情報がある場合、jack found と表示されますが、grep コマンドの結果は出力されません。

1.4.2 コマンドを複数行に分割する方法

Linuxのシェルスクリプトは非常に強力で、ユーザーは複数のコマンドをパイプでまとめることができますが、その結果、1行のシェルスクリプトコードに長々と読みにくいコマンドが書かれていることがよくあります。スクリプトの構造を明確にするために、1行のシェルスクリプトコードを複数行で記述することができます。

ps、grep、awk コマンドを 2 つのパイプ文字を使って結合します。

[root@localhost ~]# ps -ef | grep sshd | awk '{print $2}'
4478
12821
22028

Shellには、1つのコードを複数行に分割するための特殊文字" \" があります。

[root@localhost ~]# ps -ef | \
> grep ssh | \
> awk '{print $2}'
4478
12821
23375
[root@localhost ~]#


シェルスクリプトのパラメータとインタラクション、よくある問題についてのこの記事は終わりです。シェルスクリプトのパラメータとインタラクションについての詳しい情報は、過去の記事を検索するか、以下の記事を引き続きご覧ください。