やあ!この記事は、Howtoforgeシェルスクリプトチュートリアルシリーズの第2部です。この時点で、シリーズの最初の部分を読み、簡単なスクリプトを作成して実行する方法を知っていることを前提としています。第2部では、ユーザーからの入力を受け入れ、シェルスクリプトを使用してそれらを処理する方法を学習します。始めましょう!
Linuxの変数
プログラミング言語と同じように、Linuxシェルにはデータを変数に格納する機能があります。変数は、プログラミング言語で処理されるデータを一時的に格納するコンテナーです。 Linuxには、環境変数とシェル変数の2種類の変数があります。
環境変数はLinuxのデフォルト変数であり、シェル内のプロセス間で情報を渡すために使用されます。環境変数は大文字と小文字が区別されるため、アクセスするには常に大文字にする必要があります。
次の表は、Linuxシェルの一般的な環境変数を示しています。
変数名 | 使用法 |
BASH | Bashスクリプトのコマンドインタープリターのフルパスを保持します |
BASH_VERSION | 現在使用されているマシンのbashリリースバージョンを保持します |
ホーム | ホームディレクトリの相対パスを保持します。 |
ログ名 | 現在ログインしているユーザーのアカウント名を保持します |
OSTYPE | 使用されているマシンの現在のOSを説明する文字列を保持します |
パス | Linuxで実行可能ファイルのコロンで区切られた絶対パスを保持します |
PWD | シェルの現在の作業ディレクトリを保持します |
シェル | 優先コマンドラインシェルを保持します |
ユーザー | LOGNAMEと同様に機能します。現在ログインしているユーザーのアカウント名を保持します |
_ | 最近使用したコマンドの名前をシェルに保持します |
環境変数の値を表示するには、ユーザーはアクセスする変数の前にドル記号($)を付ける必要があります。たとえば、現在の作業ディレクトリ、ログインしているユーザー、echoを使用したOSタイプなどのシステム情報を表示するには、次のように使用します。
#!/bin/bash
echo $PWD
echo $LOGNAME
echo $OSTYPE
結果は次のとおりです。
Linuxで環境変数の全リストを取得するには、envコマンドを使用します。
システムの柔軟性を提供するために、これらの環境変数を操作できます。環境変数に値を設定するには、代入式(等号)を使用します。
例:
#!/bin/bash
echo $USER
USER="new user"
echo $USER
スクリプトの結果は次のとおりです。
スクリプトを実行すると、最初に、echo$USER行の$USERにUSER変数の値が表示されます。代入演算子(=)を使用すると、USER変数の値が変更されます。ただし、ユーザーが不明な値を環境変数に割り当てる場合、シェルはスクリプトのローカルコンテキストで環境変数と同様の別のシェル変数を作成しますが、他のアプリケーションの動作には影響しません。つまり、スクリプトが閉じられると、USER変数はデフォルト値を保持します。
前の例では、行USER ="new user"などの環境変数の値を操作するときに、変数名のドル記号($)を省略していることに注意してください。また、代入演算子を使用する場合は、USERと=記号の間にスペースを入れないでください。それらの間にスペースを追加すると、エラーが発生します。
シェルを使用すると、ユーザーは変数を宣言することもできます。 PHPと同様に、シェルスクリプトで変数を宣言するために、ユーザーはそのデータ型の宣言について心配する必要はありません。インタプリタは、実行時にユーザーが変数に格納するデータに基づいて、変数のデータ型を自動的に検出します。
他のプログラミング言語と同様に、シェル変数の命名には規則があります。ルールの概要は次のとおりです。
- 変数の名前は、文字またはアンダースコアで始まる必要があります。
- 英数字またはアンダースコアのみを含める必要があります。
- 変数では大文字と小文字が区別されるため、変数path、PATH、およびPathは異なります。
このルールを証明するために、以下に簡単なスクリプトを作成します。
#!/bin/bash
12abc=10
abc#*=10
_abc=10
_ABC=2
echo $12abc $abc#* $_abc $_ABC
2行目と3行目では、変数12abcが数字で始まり、変数abc#*に不正な文字が含まれているため、「コマンドが見つかりません」というエラーが返されます。また、_abcと_ABCは異なる変数であり、行_ABC=2は_abcの値をオーバーライドしないことも証明しました。
読み取りコマンドを使用してシェル変数に値を割り当てる:
readは、ユーザーからの入力を受け入れることを可能にするコマンドです。 readコマンドを使用する際の構文は次のとおりです。
read <variable_name>
たとえば、ユーザーが自分の名前と名前を入力して表示できるようにするスクリプトを作成します。ユーザーに何をすべきかを知らせるために、echoコマンドでユーザープロンプトを表示します。
#!/bin/bash
echo "Your first name: "
read fname
echo "Your last name:"
read lname
echo "Hello $fname $lname ! I am learning how to create shell scripts."
結果は次のとおりです。
前の例のように、変数を使用するために変数を宣言する必要がないことに注意してください。インタプリタは、読み取りコマンドで使用される変数も自動的に作成します。ただし、この例では、echoコマンドを繰り返し使用して、ユーザーへのプロンプトを作成しました。 readコマンドには、ユーザー入力を受け入れながらプロンプトを作成する機能もあります。 readコマンドでpromptを使用する構文は次のとおりです。
read -p "Your prompt: " <variable_name>
以前のコードを単純化するために、コードを次のように再構築できます。
#!/bin/bash
read -p "Your first name: " fname
read -p "Your last name: " lname
echo "Hello $fname $lname ! I am learning how to create shell scripts"
readコマンドのもう1つの利点は、コマンドプロンプトがテキストの直後にあり、下の行にはないことです。
readコマンドを使用して、パスワードを受け入れることもできます。通常の入力とは異なり、パスワードはセキュリティを確保するためにマスクされています。パスワードを受け入れる際の構文は次のとおりです。
read -s -p "your prompt" <variable_name>
入力を受け入れて出力を表示する以外に、bashシェルには組み込みの算術オプションもあります。次の表は、Bashシェルの組み込みの算術演算子をまとめたものです。
オペレーター | 説明 | 構文 | 使用法 |
+ | 追加 | a =$((b + c)) | bとcの値を追加し、それを変数aに格納します |
- | 減算 | a =$((b-c)) | bからcの値を減算し、それを変数aに格納します |
* | 乗算 | a =$((b * c)) | bとcの値を乗算し、それを変数aに格納します |
/ | 分割 | a =$((b / c)) | bの値をcで除算し、変数aに格納します |
% | モジュラス | a =$((b%c)) | bとcのモジュロ除算を実行し、変数aに格納します |
++ | プリインクリメント | $((++ aa)) | 変数の値をすぐにインクリメントします |
++ | ポストインクリメント | $((a ++)) | 変数aの値をインクリメントし、次の行への変更を反映します |
- | 事前デクリメント | $((-a)) | 変数aの値をすぐにデクリメントします |
- | ポストデクリメント | $((a-)) | 変数aの値を減らし、次の行への変更を反映します |
** | べき乗 | $((a ** 2)) | aの値を2の指数に上げます |
+ = | プラス等しい | $((a + =b)) | aとbの値を追加し、それを変数aに格納します |
-= | マイナス等しい | $((a- =b)) | aからbの値を減算し、それを変数aに格納します |
* = | 等しい時間 | $((a * =b)) | aとbの値を乗算し、それを変数aに格納します |
/ = | スラッシュが等しい | $((a / =b)) | aの値をbで除算し、変数aに格納します |
%= | Mod-equal | $((a%=b)) | aとbの間でモジュロ除算を実行し、それを変数aに格納します |
算術命令を実行するたびに、すべての変数がドル記号と二重括弧で囲まれることに注意してください。これを行うことにより、インタープリターは変数の値を整数として扱います。これがないと、インタプリタは変数の値を文字列として扱います。例については、以下のスクリプトをご覧ください:
#!/bin/bash
read -p "Enter int1: " a
read -p "Enter int2: " b
echo $((a+b))
c=$a+$b
echo $c
この例を実行すると、行$((a + b))は、変数aとbにそれぞれ格納されているユーザーの値を追加し、c =$ a +$bは変数aとbを文字列として扱います。
入力を受け入れて変数に格納する方法と、bashシェルスクリプトで算術演算を実行する方法について説明しました。次のパートでは、制御構造、特に決定構造について説明します。
Linux情報プロジェクト。 (2007)。 2015年4月29日、Linfo.orgから取得:http://www.linfo.org/
クーパー、M。(n.d.)高度なBashスクリプティングガイド。 2015年4月29日、http://www.tldp.org/LDP/abs/html/
から取得環境変数。 (n.d.)。 2015年4月29日、Ubuntuドキュメントから取得:https://help.ubuntu.com/community/EnvironmentVariables