2.1 レッスン 2
Certificate: |
Linux Essentials |
---|---|
Version: |
1.6 |
Topic: |
2 Linuxでのやり方を見つける |
Objective: |
2.1 コマンドラインの基本 |
Lesson: |
2 of 2 |
はじめに
すべてのシェルは、シェルセッションの中に一連のステータス情報を管理しています。この実行時情報はセッションの途中で変更されることがあり、シェルの動作に影響を与えます。また、このデータはシステム構成を決定するプログラムによっても使用されます。このデータのほとんどは、このレッスンで取り上げる、いわゆる 変数 に保存されます。
変数
変数は、テキストや数値などのデータを保存する記憶するものです。セットした値を後で参照することができます。変数には名前が付けられていて、内容が変更されてもその名前でアクセスすることができます。変数は、ほとんどのプログラミング言語で非常に一般的な道具です。
Linuxのほとんどのシェルでは、2種類の変数があります:
- ローカル変数(シェル変数)
-
この種の変数は、現在のシェルでのみ使用することができます。ローカル変数を作成した後に、シェルから別のプログラムを実行すると、そのプログラムは変数にアクセスすることができません。サブプロセスに引き継がれないことから、これらを ローカル変数 と呼びます。
- 環境変数
-
環境変数は、シェルセッションと、そのシェルセッションから生成されたサブプロセスの両方で利用できます。実行するコマンドに設定データを渡すために、変数を使用することができます。プログラムがこれらの変数にアクセスできることから、 環境変数 と呼ばれています。環境変数の名前は、大文字で書くのが慣例です (例:
PATH
、DATE
、USER
)。デフォルトの環境変数のセットは、ユーザのホームディレクトリや、端末種類などに関する情報を提供します。すべての環境変数の集合そのものを 環境 と呼ぶこともあります。
Note
|
変数は永続的ではありません。それらを設定したシェルを閉じると、すべての変数とその内容も無くなります。ほとんどのシェルでは、新しいシェルが開始されるたびに読み取られる、変数設定を含む構成ファイルがあります。永続的に設定する必要がある変数は、これらの構成ファイルの1つに追加する必要があります。 |
変数の操作
システム管理者は、ローカル変数と環境変数の両方を作成、変更、または削除する必要があります。
ローカル変数の操作
ローカル変数をセットするには、=
(イコール)オペレータを使います。単純な割り当てでは、ローカル変数が作成されます:
$ greeting=hello
Note
|
|
echo
コマンドを使用すると、任意の変数を表示できます。コマンドは、引数として指定されたテキストを表示します。
$ echo greeting greeting
変数の値にアクセスするには、変数名の前に $
(ドル記号)を置きます。
$ echo $greeting hello
このように、変数が作成されています。次に、別のシェルを開いて、同じ変数の内容を表示してみます。
$ echo $greeting
何も表示されません。これは、変数が特定のシェルにのみ存在していることを示しています。
変数が実際にローカル変数であることを確認するには、新しいプロセスを生成して、そのプロセスが変数にアクセスできるかどうかを確認します。別のシェルを起動して、そのシェルで echo
コマンドを実行することで確認できます。新しいシェルは新しいプロセスで実行されますが、親プロセスからローカル変数を継承しません。
$ echo $greeting world hello world $ bash -c 'echo $greeting world' world
Note
|
上記の例では、(echoコマンドを)シングルクオートで囲んで下さい。 |
変数を削除するには、unset
コマンドを使用します:
$ echo $greeting hey $ unset greeting $ echo $greeting
Note
|
|
グローバル変数(環境変数)の操作
変数をサブプロセスでも使用できるようにするには、 export
コマンドを使用して、ローカル変数を環境変数に転換します。コマンドに変数名を指定して実行すると、その変数がシェルの環境に追加されます。
$ greeting=hello $ export greeting
Note
|
繰り返しますが、 |
環境変数を作成する簡単な方法は、上記の方法を組み合わせて、コマンドの引数で変数の値を割り当てることです。
$ export greeting=hey
もう一度、サブプロセスから変数にアクセスできることを確認してみましょう:
$ export greeting=hey $ echo $greeting world hey world $ bash -c 'echo $greeting world' hey world
環境変数を使用するもう一つの方法は、コマンドの手前に環境変数を指定することです。タイムゾーンを保持する環境変数 TZ
を使って確認してみましょう。 date
コマンドは、表示する時刻のタイムゾーンを決定するために、この環境変数を使います。
$ TZ=EST date Thu 31 Jan 10:07:35 EST 2019 $ TZ=GMT date Thu 31 Jan 15:07:35 GMT 2019
env
コマンドで、環境変数の一覧を表示することができます。
PATH
変数
PATH
変数は、Linuxシステムにおける最も重要な環境変数のひとつです。これには、Linuxシェルからコマンドと見なされる実行可能プログラムを格納したディレクトリのリストを、コロンで区切って格納します。
$ echo $PATH /home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
変数にディレクトリを追加するには、区切りのコロン( :
)も指定します。
$ PATH=$PATH:new_directory
例を示します:
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin $ PATH=$PATH:/home/user/bin $ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/user/bin
この例では、PATH
に割り当てる新しい値の中に $PATH
が含まれています。 $PATH
は、コマンド実行の前に展開されて、変数の元の内容が保持されることになります。もちろん、割り当ての際に、他の変数を使用することもできます。
$ mybin=/opt/bin $ PATH=$PATH:$mybin $ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/user/bin:/opt/bin
PATH
変数は、コマンドラインで作業するときに必要不可欠なものなので、取り扱いには注意が必要です。次の PATH
変数の例を見てみましょう:
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
which
コマンドの引数にコマンド名を指定すると、シェルがそのコマンドを呼び出す方法を見ることができます。例えば、 nano
コマンドがどこにあるのかをを見てみましょう:
$ which nano /usr/bin/nano
例に示すように、 nano
の実行可能形式は、 /usr/bin
ディレクトリにあります。変数からディレクトリを削除して、コマンドがまだ使えるかを見てみましょう:
$ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/bin:/usr/games $ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/bin:/usr/games
もう一度、 nano
コマンドを探します:
$ which nano which: no nano in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/bin:/usr/games)
例に示すように、コマンドが見つからないため、実行できません。エラーメッセージには、コマンドが見つからなかった理由と検索した場所も説明されています。 ディレクトリを元に戻して、再度コマンドを実行してみましょう:
$ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin $ which nano /usr/bin/nano
今度はまた、コマンドが実行できました。
Tip
|
|
演習
-
number
というローカル変数を作ってみましょう。 -
ORDER
という環境変数を、2通りの方法のいずれかで作ってみましょう。 -
変数の名前とその値の両方を表示しましょう。
-
先に作った変数のスコープは何ですか?
発展演習
-
ローカル変数
nr_files
を作成して、/etc/passwd
ファイルの行数を格納してみましょう。ヒント: コマンドwc
と「コマンド置換」を調べましょう。引用符を忘れないでください。 -
環境変数
ME
を作成して、変数USER
の値を割り当てましょう。 -
ME
に、:
をデリミター(区切り記号)として、HOME
変数の値を追加しましょう。ME
変数の値を表示します。 -
上記の日付例を使い、
today
という変数を作り、あるタイムゾーンの日付を割り当てましょう。 -
続いて、
today1
という変数を作り、システムの日付を割り当てましょう。
まとめ
このレッスンでは、次のことを学びました。
-
変数の種類
-
変数の作り方
-
変数の操作方法
演習で使用したコマンド:
env
-
現在の環境を表示する
echo
-
テキストを出力する
export
-
ローカル変数をサブプロセスから利用可能とする
unset
-
変数を削除する
演習の解答
-
number
というローカル変数を作ってみましょう。$ number=5
-
ORDER
という環境変数を、2通りの方法のいずれかで作ってみましょう。$ export ORDER=desc
-
変数の名前とその値の両方を表示しましょう。
$ echo number number $ echo ORDER ORDER $ echo $number 5 $ echo $ORDER desc
-
先に作った変数のスコープは何ですか?
-
ローカル変数
number
のスコープは、現在のシェルのみです。 -
環境変数
ORDER
のスコープは、現在のシェルとそれによって生成されたすべてのサブシェルです。
-
発展演習の解答
-
ローカル変数
nr_files
を作成して、/etc/passwd
ファイルの行数を格納してみましょう。ヒント: コマンドwc
と「コマンド置換」を調べましょう。引用符を忘れないでください。$ nr_files=`wc -l /etc/passwd`
-
環境変数
ME
を作成して、変数USER
の値を割り当てましょう。$ export ME=$USER
-
ME
に、:
をデリミター(区切り記号)として、HOME
変数の値を追加しましょう。ME
変数の値を表示します。$ ME=$ME:$HOME $ echo $ME user:/home/user
-
上記の日付例を使い、
today
という変数を作り、あるタイムゾーンの日付を割り当てましょう。以下にはタイムゾーンとしてGMTとESTを例に挙げていますが、有効なタイムゾーンであれば何でも構いません。
$ today=$(TZ=GMT date) $ echo $today Thu 31 Jan 15:07:35 GMT 2019
または
$ today=$(TZ=EST date) $ echo $today Thu 31 Jan 10:07:35 EST 2019
-
続いて、
today1
という変数を作り、システムの日付を割り当てましょう。システムが`GMT`にあることを仮定します:
$ today1=$(date) $ echo $today1 Thu 31 Jan 10:07:35 EST 2019