105.1 レッスン 2
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
105 シェルとシェルスクリプト |
Objective: |
105.1 シェル環境をカスタマイズして使用する |
Lesson: |
2 of 3 |
はじめに
情報を一時的に記録するための仮想的な箱を変数と呼びます。Bashでは、シェルに局所的 (変数を作成したシェルの中でのみ利用できるもの)と 環境に大域的 (子シェルやプロセスに継承されるもの)の2種類の変数があります。前のレッスンでは、シェルとその初期化スクリプトについて説明しました。それらの起動ファイルで、変数やエイリアス、関数を定義することで、好みのシェル環境を作成できることを学習していきましょう。
変数:割り当てと参照
変数は、値(内容)に名前を付けることで定義します。
名前に値を与えることを 変数への割り当て (ないしは 代入)と呼び、それによって変数が作成ないし設定されます。また、変数の名前からその内容にアクセスすることを 変数の参照 と呼びます。
変数に値を割り当てる構文は次のとおりです。
<変数名>=<値>
例えば次のようになります。
$ distro=zorinos
変数 distro
は zorinos
と同じです。つまり、値 zorinos
を保持するメモリ領域があり、distro
はそこへのポインタです。
なお、変数を割り当てるときは、等号の両側にスペースを入れることはできないことに注意してください。
$ distro =zorinos -bash: distro: command not found $ distro= zorinos -bash: zorinos: command not found
等号の前後に空白を入れると、Bashは distro
ないし zorinos
をコマンドと見なします。
変数を参照するには(つまり、その値を確認するには)、変数名の前に $
を付けた echo
コマンドを使用します。
$ echo $distro zorinos
変数名
変数の名前を決めるときには、いくつかのルールがあります。
変数の名前には、文字(a-z
、A-Z
)、数字(0-9
)、アンダースコア(_
)のみが使えます。
$ distro=zorinos $ echo $distro zorinos $ DISTRO=zorinos $ echo $DISTRO zorinos $ distro_1=zorinos $ echo $distro_1 zorinos $ _distro=zorinos $ echo $_distro zorinos
先頭が数字ではいけません。Bashが混乱します。
$ 1distro=zorinos -bash: 1distro=zorinos: command not found
空白を含めることはできません(引用符も使えません)。慣例的に、空白の代わりにアンダースコアを使用します。
$ "my distro"=zorinos -bash: my: command not found $ my_distro=zorinos $ echo $my_distro zorinos
変数の値
変数の値を参照するときにも、いくつかのルールをがあります。
変数には、任意の英数字(a-z
、A-Z
、0-9
)と、ほとんどの記号(?
、!
、*
、.
、/
、など)を含めることができます。(訳注:言語設定によりますが、日本語を含めることもできます。)
$ distro=zorin12.4? $ echo $distro zorin12.4?
変数値にひとつ以上の空白が含まれている場合は、引用符で囲む必要があります。
$ distro=zorin 12.4 -bash: 12.4: command not found $ distro="zorin 12.4" $ echo $distro zorin 12.4 $ distro='zorin 12.4' $ echo $distro zorin 12.4
変数の値に、リダイレクトに使用される文字(<
、>
)やパイプ記号(|
)などの記号が含まれている場合は、値全体を引用符で囲む必要があります。次のコマンドを実行すると、zorin
という名前の空のファイルが作成されてしまいます。
$ distro=>zorin $ echo $distro $ ls zorin zorin
引用符を使用するとこうなります。
$ distro=">zorin" $ echo $distro >zorin
なお、一重引用符と二重引用符の働きは異なります。変数操作(代入なのか参照なのか)に応じて、どちらの引用符を使用するかによって結果が異なります。変数への代入の場合、一重引用符は値のすべての文字を 文字通り に扱いますが、二重引用符の場合は 変数置換 が行われます。
$ lizard=uromastyx $ animal='My $lizard' $ echo $animal My $lizard $ animal="My $lizard" $ echo $animal My uromastyx
一方、値に空白を含む変数を参照する場合には、(コマンドラインでの)フィールド分割 や パス名の拡張 を回避するために、echo
コマンドの引数を二重引用符で囲む必要があります。
$ lizard=" genus | uromastyx" $ echo $lizard genus | uromastyx $ echo "$lizard" genus | uromastyx
変数に感嘆符を含む文字列を代入する場合、感嘆符は文字列の最後の文字なくてはいけません。(感嘆符の後に文字があると、Bashは history
イベントを参照していると見なします)。(訳注:感嘆符を含む場合も一重引用符で囲めば特別な意味が無くなります。)
$ distro=zorin.?/!os -bash: !os: event not found $ distro=zorin.?/! $ echo $distro zorin.?/!
バックスラッシュは、別のバックスラッシュでエスケープする必要があります。また、バックスラッシュが文字列の最後の文字でありそれがエスケープされていない場合、Bashは改行が必要であると解釈して新しい行の入力を待ちます。
$ distro=zorinos\ > $ distro=zorinos\\ $ echo $distro zorinos\
次の2つのセクションでは、 ローカル 変数と 環境 変数の違いを説明します。
ローカル変数またはシェル変数
ローカル変数またはシェル変数は、それらを作成したシェルでのみ有効です。ローカル変数名は小文字で表記するのが慣例となっています。
挙動を確認するために、ローカル変数を作成しましょう。上で説明したように適当な変数名を選択し、適当な値を代入します。例えば:
$ reptile=tortoise
(訳注:reptileは「は虫類」、tortoiseは「カメ」の意)
echo
コマンドで変数を参照して確認します。
$ echo $reptile tortoise
スクリプトの作成など、変数を変更不可とすることが適当な場合があります。変数を変更不可(読み出し専用)にしたい場合は、readonly
で変数を作成します。
$ readonly reptile=tortoise
あるいは、作成した後に変更不可とすることもできます。
$ reptile=tortoise $ readonly reptile
ここで、reptile
の値を変更しようとすると、エラーになります。
$ reptile=lizard -bash: distro: readonly variable
Note
|
現在のセッションのすべての読み出し専用変数を一覧表示するには、ターミナルに |
ローカル変数を扱うときに役立つコマンドは set
です。
set
は、現在割り当てられているすべてのシェル変数と関数を一覧表示します。行数が多いことがある(自分で試してみてください!)ので、less
などのページャーと組み合わせて使用することがお勧めです。
$ set | less BASH=/bin/bash BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath BASH_ALIASES=() BASH_ARGC=() BASH_ARGV=() BASH_CMDS=() BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d BASH_LINENO=() BASH_SOURCE=() BASH_VERSINFO=([0]="4" [1]="4" [2]="12" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu") BASH_VERSION='4.4.12(1)-release' (...)
作成した reptile
変数があるでしょうか?
$ set | grep reptile reptile=tortoise
はい、ありました!
ただし、ローカル変数である reptile
は、現在のシェルから生成された子プロセスには継承されません。
$ bash $ set | grep reptile $
そしてもちろん、その値をエコーで出力することもできません。
$ echo $reptile $
Note
|
ターミナルに |
変数(ローカルまたはグローバルどちらも)を削除するには、unset
コマンドを使用します。
$ echo $reptile tortoise $ unset reptile $ echo $reptile $
Note
|
|
グローバル変数または環境変数
グローバル変数(環境変数とも呼ぶ)は、現在のシェルと、シェルから生成されたすべてのプロセスに引き継がれます。環境変数名は大文字とするのが慣例です。
$ echo $SHELL /bin/bash
これらの変数の値を、他の変数に代入することができます。参照した変数の値と、代入された変数の値は同じになります。
$ my_shell=$SHELL $ echo $my_shell /bin/bash $ your_shell=$my_shell $ echo $your_shell /bin/bash $ our_shell=$your_shell $ echo $our_shell /bin/bash
シェルのローカル変数を環境変数にするには、export
コマンドを使用します。
$ export reptile
export reptile
によってローカル変数が環境変数に変換されたので、子シェルがその変数を使用できるようになりました。
$ bash $ echo $reptile tortoise
export
を使用して、変数への代入とエクスポートを同時に実行できます。
$ export amphibian=frog
(訳注:amphibianは「両生類」、frogは「カエル」を意味します。)
これで、新しいBashのインスタンスからも、新しい変数を利用できます。
$ bash $ echo $amphibian frog
Note
|
|
export
コマンドを単体(ないしは -p
オプション付きで)実行すると、すべての環境変数を一覧表示します。
$ export declare -x HOME="/home/user2" declare -x LANG="en_GB.UTF-8" declare -x LOGNAME="user2" (...) declare -x PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" declare -x PWD="/home/user2" declare -x SHELL="/bin/bash" declare -x SHLVL="1" declare -x SSH_CLIENT="192.168.1.10 49330 22" declare -x SSH_CONNECTION="192.168.1.10 49330 192.168.1.7 22" declare -x SSH_TTY="/dev/pts/0" declare -x TERM="xterm-256color" declare -x USER="user2" declare -x XDG_RUNTIME_DIR="/run/user/1001" declare -x XDG_SESSION_ID="8" declare -x reptile="tortoise"
Note
|
コマンド |
すべての環境変数の一覧表示するために、env
コマンドと printenv
コマンドの2つも使えます。
$ env SSH_CONNECTION=192.168.1.10 48678 192.168.1.7 22 LANG=en_GB.UTF-8 XDG_SESSION_ID=3 USER=user2 PWD=/home/user2 HOME=/home/user2 SSH_CLIENT=192.168.1.10 48678 22 SSH_TTY=/dev/pts/0 MAIL=/var/mail/user2 TERM=xterm-256color SHELL=/bin/bash SHLVL=1 LOGNAME=user2 XDG_RUNTIME_DIR=/run/user/1001 PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games _=/usr/bin/env
printenv
コマンドは env
と同様に一覧を表示するだけではなく、echo
コマンドと同様に変数の値を確認するためにも使用できます。
$ echo $PWD /home/user2 $ printenv PWD /home/user2
ただし printenv
では、変数名の前に $
を付けないことに注意してください。
Note
|
変数 |
環境を変更してプログラムを実行する
env
コマンドを使って、シェルの環境変数を、プログラムの実行時に変更することができます。
最小の環境で新しいBashセッションを開始するには、ほとんどの変数(および関数とエイリアス)をクリアする -i
オプションを付けた env
コマンドを使用します。
$ env -i bash
これで、ほとんどの環境変数がなくなりました。
$ echo $USER $
ほんの少ししか残っていないことを確認してみます。
$ env LS_COLORS= PWD=/home/user2 SHLVL=1 _=/usr/bin/printenv
env
を使用して、実行するプログラムに渡す環境を指定することもできます。
前のレッスンの、非対話的な非ログインシェル に関する説明で、スクリプトは標準の起動ファイルを読み込まず、代わりに BASH_ENV
変数が存在する場合にはその値を起動ファイル名として使用することを説明しました。
その働きを確認してみましょう。
-
.startup_script
という独自の起動スクリプトを作成し、以下の内容とします。CROCODILIAN=caiman
(訳注:crocodilianは「ワニ類」、caimanは「カイマン」の意です。)
-
test_env.sh
という名前のBashスクリプトを作成して、以下の内容とします。#!/bin/bash echo $CROCODILIAN
-
test_env.sh
スクリプトに実行可能ビットを設定します。$ chmod +x test_env.sh
-
env
を使用してBASH_ENV
を.startup_script
に設定して、test_env.sh
を実行します。$ env BASH_ENV=/home/user2/.startup_script ./test_env.sh caiman
env
コマンドは省略することもできます。(訳注:Bashにはenv
コマンドの変数代入に相当する機能が内蔵されています。env
コマンドのオプション(-i
など)を指定する必要がない場合には、env
コマンドを指定する必要はありません。)$ BASH_ENV=/home/user2/.startup_script ./test_env.sh caiman
Note
|
|
一般的な環境変数
ここからは、Bashの起動ファイルで設定されることが多い、一般的な環境変数のいくつかを紹介しましょう。デフォルトで設定されている環境変数は、ディストリビューションによって異なります。
DISPLAY
-
Xサーバーに関するもので、この変数の値には以下の3つの要素が含まれます。
-
Xサーバーを実行しているホスト名(存在しない場合は
localhost
を意味する)。 -
区切り文字のコロン。
-
数字(通常は
0
で、そのコンピューターに接続されているディスプレイを指す)。$ printenv DISPLAY :0
この変数の値が空の場合は、Xウィンドウシステムを使用していないことを意味します。
my.xserver:0:1
のように、追加の番号がある場合は、複数存在する場合の画面番号を意味します。
-
HISTCONTROL
-
この変数は
HISTFILE
(後述)に保存するコマンド行の種類を制御します。以下の3つのいずれかの値を指定できます。ignorespace
-
空白で始まるコマンド行は保存しない。
ignoredups
-
直前のコマンド行と同じコマンド行は保存しない。
ignoreboth
-
上記2種類のいずれかに該当するコマンド行は保存しない。
$ echo $HISTCONTROL ignoreboth
HISTSIZE
-
シェルセッションの最中にメモリに保存されるコマンド行の最大数を指定します。
$ echo $HISTSIZE 1000
HISTFILESIZE
-
HISTFILE
に保存されるコマンド行の数(開始時に読み込まれるコマンド数、終了時に書き込むコマンド数)を指定します。$ echo $HISTFILESIZE 2000
HISTFILE
-
入力されたコマンドを格納するファイルの名前。デフォルトでは、
~/.bash_history
です。$ echo $HISTFILE /home/user2/.bash_history
NoteHISTFILE
の内容を表示するには、単純にhistory
と入力します。あるいは、history 3
のように、引数としてコマンド数を指定することで、history
が表示するコマンドの数を制限できます。 HOME
-
ユーザーがログインしたときに、この変数にはホームディレクトリの絶対パスが格納されます。
この
~/.profile
の一節から一目瞭然でしょう。(このコードは"$HOME/.bashrc"
が存在すれば、それを取り込んでいます。)# include .bashrc if it exists if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi
Noteif
ステートメントを完全に理解していなくても心配することはありません。後のレッスンで説明します。~
は$HOME
と同じであることを忘れないで下さい。$ echo ~; echo $HOME /home/carol /home/carol
Note複数のコマンドをセミコロン(
;
)で区切り、続けて実行することができます。if
ステートメントの例を見てみましょう。$ if [ ~ == "$HOME" ]; then echo "true"; else echo "false"; fi true
Note等号
=
は変数への代入に、==
は等しいことを調べるために、それぞれ使用されることを覚えておきましょう。 HOSTNAME
-
この変数には、ホストコンピューターの名前が格納されます。
$ echo $HOSTNAME debian
HOSTTYPE
-
この変数には、ホストコンピュータのプロセッサ アーキテクチャが格納されます。
$ echo $HOSTTYPE x86_64
LANG
-
この変数には、システムのロケール(言語指定)が格納されます。
$ echo $LANG en_UK.UTF-8
LD_LIBRARY_PATH
-
この変数には、プログラムが使用する共有ライブラリの格納位置を、コロンで区切ったディレクトリのリストとして格納します。
$ echo $LD_LIBRARY_PATH /usr/local/lib
MAIL
-
この変数には、Bashが電子メールの到着をチェックするファイル名を格納します。
$ echo $MAIL /var/mail/carol
この変数に格納される値としては、
/var/spool/mail/$USER
などが一般的です。 MAILCHECK
-
この変数には、Bashが新着メールをチェックする頻度を秒単位の数値で格納します。
$ echo $MAILCHECK 60
PATH
-
この環境変数には、プログラムを実行するように指示されたときに、Bashが実行可能ファイルを探すディレクトリのリストが格納されています。サンプルに使用したマシンでは、システム全体の
/etc/profile
ファイルでこの変数が設定されています。if [ "`id -u`" -eq 0 ]; then PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" else PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" fi export PATH
if
ステートメントによってユーザーIDを確認し、 — その結果(root
であるか一般ユーザーか)に応じて — いずれかのPATH
が設定されます。最後に、選択したPATH
をexport
でグローバルな環境変数にします。PATH
の値に関して、2つのことに注意してください。-
ディレクトリ名は絶対パスで記述します。
-
コロンは区切り文字です。
一般ユーザーの
PATH
に/usr/local/sbin
ディレクトリを含めたい場合は、行を次のように変更します。(...) else PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/local/sbin" fi export PATH
この変更によって、一般ユーザーとしてログインしたときに、変数の値がどのように変化するかを見てみましょう。
# su - carol $ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/local/sbin
Note現在の
PATH
に/usr/local/sbin
を追加することもできます。コマンドラインでPATH=/usr/local/sbin:$PATH
またはPATH=$PATH:/usr/local/sbin
と入力します。前者は実行可能ファイルを検索する際に/usr/local/sbin
を最初に、後者は同じディレクトリを最後に探します。
-
PS1
-
この変数には、Bashプロンプトの文字列が格納されます。次の部分コード(これも
/etc/profile
から)では、if
ステートメントでユーザーIDを確認し、それに応じたプロンプトを表示します(root
の場合は#
、一般ユーザーの場合は$
)。if [ "`id -u`" -eq 0 ]; then PS1='# ' else PS1='$ ' fi
Noteroot
のid
は0
です。root
になって、id -u
で確認してみましょう。その他にも、以下のようなプロンプト変数があります。
PS2
-
コマンドが複数行に及ぶ場合に、継続行のプロンプトとして使用されます。通常は
>
です。 PS3
-
select
コマンドのプロンプトとして使用されます。 PS4
-
デバッグ用に出力された行を示します。通常は
+
です。
SHELL
-
この変数には、現在のシェルの絶対パスが格納されます。
$ echo $SHELL /bin/bash
USER
-
この変数には、現在のユーザー名が格納されます。
$ echo $USER carol
演習
-
“コマンド” 欄の変数割り当てで得られる変数が “ローカル”(シェル変数) か、 “グローバル”(環境変数) か示してください。
コマンド ローカル グローバル debian=mother
ubuntu=deb-based
mint=ubuntu-based; export mint
export suse=rpm-based
zorin=ubuntu-based
-
“コマンド” で得られる “出力” を調べて、その意味を説明してください。
コマンド 出力 意味 echo $HISTCONTROL
ignoreboth
echo ~
/home/carol
echo $DISPLAY
reptilium:0:2
echo $MAILCHECK
60
echo $HISTFILE
/home/carol/.bash_history
-
“誤ったコマンド” 欄には誤った変数への割り当てが行われています。“正しいコマンド” 欄に正しいコマンド、“参照方法” 欄にその変数を参照するコマンド、“出力結果” 欄にその実行結果を記入して下さい。
誤ったコマンド 正しいコマンド 参照方法 出力結果 lizard =chameleon
cool lizard=chameleon
lizard=cha|me|leon
lizard=/** chameleon **/
win_path=C:\path\to\dir\
-
“やりたいこと” 欄に応じて、“コマンド” 欄を記入してください。
やりたいこと コマンド シェルの言語指定をUTF-8のスペイン語(
es_ES.UTF-8
)にセットする作業ディレクトリの名前を出力する
ssh
接続に関する情報を格納する環境変数を表示する実行可能ファイルを検索する最後のディレクトリとして
/home/carol/scripts
を含めるように、PATH
を設定するmy_path
の値をPATH
にセットするmy_path
の値をPATH
の値にセットする -
mammal
という名前のローカル変数を作成し、それに値gnu
を割り当てて下さい。 -
別のローカル変数
ver_sub
を作成します。mammal
の変数置換を使用して、echo $var_sub
でその値を参照した結果がThe value of mammal is gnu
となるようにして下さい。 -
mammal
を環境変数に変換して下さい。 -
set
とgrep
を使って、変数一覧からmammal
を検索してください。 -
今度は、
env
とgrep
を使ってmammal
を検索してください。 -
値が
penguin
であるBIRD
という名前の環境変数を作ります。2つのコマンドを1行で連続して使ってください。 -
今度は1つのコマンドで、値が
yellow-eyed penguin
であるNEW_BIRD
という名前の環境変数を作って下さい。 -
自分が
user2
であるとして、ホームディレクトリにbin
という名前のフォルダを作成して下さい。3つの方法があります。 -
~/bin
フォルダーがbash
がプログラムを検索する最初のディレクトリになるようにPATH
をセットするコマンドを実行して下さい。 -
再起動後も
PATH
の値が変更されないように、~/.profile
にif
ステートメントを追加してください。
発展演習
-
let
: 算術式の評価以上のもの。-
helpコマンドないしWebで調べて、
let
コマンドが変数をセットする動作を調べてみましょう。your_val
という新しいローカル変数を作成して、5に5を足した結果の値(すなわち10
)を割り当てて下さい。 -
次に、
your_val
と言う名前の変数を作成して、my_val
の値を2で割った結果の値(すなわち5
)を割り当てて下さい。
-
-
コマンドの実行結果を変数にすることも可能で、コマンド置換 と呼ばれます。それを調べてから、次の
music_info
という関数を見てください。music_info(){ latest_music=`ls -t ~/Music | head -n 5` echo -e "Your latest 5 music files:\n$latest_music" }
コマンド
ls -t ~/Music | head -n 5
の結果が、latest_music
変数の値になります。echo
コマンドでlatest_music
変数を参照すると、Music
フォルダーに保存されている音楽ファイルを新しい順に5つ出力します。次のコマンドと同じ意味になるのはどれですか?
latest_music=`ls -t ~/Music | head -n 5`
選択肢 A:
latest_music=$(ls -t ~/Music| head -n 5)
選択肢 B:
latest_music="(ls -t ~/Music| head -n 5)"
選択肢 C:
latest_music=((ls -t ~/Music| head -n 5))
まとめ
このレッスンでは、次のことを学びました。
-
シェル環境における変数は、シェル自身や他のプログラムによって利用されるので非常に重要であること。
-
変数を割り当てて、参照する方法。
-
ローカル
変数とグローバル
(環境
)変数の違い。 -
変数を読み出し専用とする方法。
-
export
コマンドで、ローカル変数を環境変数に変換する方法。 -
すべての環境変数を一覧表示する方法。
-
変更した環境でプログラムを実行する方法。
-
起動スクリプトによって変数を永続的とする方法。
-
一般的な環境変数:
DISPLAY
、HISTCONTROL
、HISTSIZE
、HISTFILESIZE
、HISTFILE
、HOME
、HOSTNAME
、HOSTTYPE
、LANG
、LD_LIBRARY_PATH
、MAIL
、MAILCHECK
、PATH
、PS1
とその他のプロンプト変数、SHELL
、USER
。 -
チルダ(
~
)の意味. -
if
ステートメントの基本の基本。
このレッスンでは、以下のコマンドを説明しました。
echo
-
変数を参照する。
ls
-
ディレクトリの内容を一覧表示します。
readonly
-
変数を変更不可とする。 シェルセッションのすべての読み取り専用変数を一覧表示する。
set
-
シェルセッションのすべての変数と関数を一覧表示する。
grep
-
パターンに一致する行を出力する。
bash
-
新しいシェルを起動する。
unset
-
変数を削除する。
export
-
ローカル変数を環境変数に変換する。 環境変数を一覧表示する。
env
-
環境変数を一覧表示する。 環境を変更してプログラムを実行する。
printenv
-
環境変数を一覧表示する。 変数を参照する。
chmod
-
ファイルのモードビットを変更します。たとえば、ファイルを実行可能にするなど。
history
-
以前実行したコマンドを一覧表示する。
su
-
ユーザーIDを変更する、ないし、スーパーユーザーになる。
id
-
ユーザーIDを出力する。
演習の解答
-
“コマンド” 欄の変数割り当てで得られる変数が “ローカル”(シェル変数) か、 “グローバル”(環境変数) か示してください。
コマンド ローカル グローバル debian=mother
Yes
No
ubuntu=deb-based
Yes
No
mint=ubuntu-based; export mint
No
Yes
export suse=rpm-based
No
Yes
zorin=ubuntu-based
Yes
No
-
“コマンド” で得られる “出力” を調べて、その意味を説明してください。
コマンド 出力 意味 echo $HISTCONTROL
ignoreboth
重複するコマンドとスペースで始まるコマンドは、どちらも
history
に保存されないecho ~
/home/carol
carol
のHOME
は/home/carol
であるecho $DISPLAY
reptilium:0:2
マシン
reptilium
でXサーバーが実行されており、最初のディスプレイの2番目の画面を使用しているecho $MAILCHECK
60
メールチェックは60分ごとに行われる
echo $HISTFILE
/home/carol/.bash_history
history
は/home/carol/.bash_history
に保存される -
“誤ったコマンド” 欄には誤った変数への割り当てが行われています。“正しいコマンド” 欄に正しいコマンド、“参照方法” 欄にその変数を参照するコマンド、“出力結果” 欄にその実行結果を記入して下さい。
誤ったコマンド 正しいコマンド 参照方法 出力結果 lizard =chameleon
lizard=chameleon
echo $lizard
chameleon
cool lizard=chameleon
cool_lizard=chameleon
(例)echo $cool_lizard
chameleon
lizard=cha|me|leon
lizard="cha|me|leon"
またはlizard='cha|me|leon'
echo $lizard
cha|me|leon
lizard=/** chameleon **/
lizard="/** chameleon **/"
またはlizard='/** chameleon **/'
echo "$lizard"
/** chamelon **/
win_path=C:\path\to\dir\
win_path=C:\\path\\to\\dir\\
echo $win_path
C:\path\to\dir\
-
“やりたいこと” 欄に応じて、“コマンド” 欄を記入してください。
やりたいこと コマンド シェルの言語指定をUTF-8のスペイン語(
es_ES.UTF-8
)にセットするLANG=es_ES.UTF-8
作業ディレクトリの名前を出力する
echo $PWD
ないしpwd
ssh
接続に関する情報を格納する環境変数を表示するecho $SSH_CONNECTION
実行可能ファイルを検索する最後のディレクトリとして
/home/carol/scripts
を含めるように、PATH
を設定するPATH=$PATH:/home/carol/scripts
my_path
の値をPATH
にセットするmy_path=PATH
my_path
の値をPATH
の値にセットするmy_path=$PATH
-
mammal
という名前のローカル変数を作成し、それに値gnu
を割り当てて下さい。mammal=gnu
-
別のローカル変数
ver_sub
を作成します。mammal
の変数置換を使用して、echo $var_sub
でその値を参照した結果がThe value of mammal is gnu
となるようにして下さい。var_sub="The value of mammal is $mammal"
-
mammal
を環境変数に変換して下さい。export mammal
-
set
とgrep
を使って、変数一覧からmammal
を検索してください。set | grep mammal
-
今度は、
env
とgrep
を使ってmammal
を検索してください。env | grep mammal
-
値が
penguin
であるBIRD
という名前の環境変数を作ります。2つのコマンドを1行で連続して使ってください。*BIRD=penguin; export BIRD*
-
今度は1つのコマンドで、値が
yellow-eyed penguin
であるNEW_BIRD
という名前の環境変数を作って下さい。export NEW_BIRD="yellow-eyed penguin"
または
export NEW_BIRD='yellow-eyed penguin'
-
自分が
user2
であるとして、ホームディレクトリにbin
という名前のフォルダを作成して下さい。3つの方法があります。mkdir ~/bin
または
mkdir /home/user2/bin
または
mkdir $HOME/bin
-
~/bin
フォルダーがbash
がプログラムを検索する最初のディレクトリになるようにPATH
をセットするコマンドを実行して下さい。PATH="$HOME/bin:$PATH"
PATH=~/bin:$PATH
ないしPATH=/home/user2/bin:$PATH
も正解です。 -
再起動後も
PATH
の値が変更されないように、~/.profile
にif
ステートメントを追加してください。if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi
発展演習の解答
-
let
: 計算だけじゃない-
helpコマンドないしWebで調べて、
let
コマンドが変数をセットする動作を調べてみましょう。your_val
という新しいローカル変数を作成して、5に5を足した結果の値(すなわち10
)を割り当てて下さい。let "my_val = 5 + 5"
または
let 'my_val = 5 + 5'
-
次に、
your_val
と言う名前の変数を作成して、my_val
の値を2で割った結果の値(すなわち5
)を割り当てて下さい。let "your_val = $my_val / 2"
または
let 'your_val = $my_val / 2'
-
-
コマンドの実行結果を変数に格納することもでき、コマンド置換 と呼ばれます。それを調べてから、次の
music_info
という関数を見てください。music_info(){ latest_music=`ls -t ~/Music | head -n 5` echo -e "Your latest 5 music files:\n$latest_music" }
コマンド
ls -t ~/Music | head -n 6
の結果が、latest_music
変数の値になります。echo
コマンドでlatest_music
変数を参照すると、Music
フォルダーに保存されている音楽ファイルを新しい順に5つ出力します。次のコマンドと同じ意味になるのはどれですか?
latest_music=`ls -t ~/Music | head -n 5`
選択肢 Aが正解です。
latest_music=$(ls -t ~/Music| head -n 5)