Linux標準教科書 第9章(v304対応)
シェルスクリプト
9.1 シェルとシェルスクリプト
シェル
シェルは OS の、特にカーネル部分を包み込んでいることからその名があり、対話機能を提供するものです。シェルはコマンドの入力を受付そのコマンドを実行し、入力したユーザに対しその結果を返す役割があります。
シェルスクリプト
/etc ディレクトリと /home ディレクトリを圧縮して外部サーバーにコピーするといった流れがあるとします。
# tar cvzf 120620-etc.tar.gz /etc
# tar cvzf 120620-home.tar.gz /home
# scp 120626-etc.tar.gz root@backup.local.example.com:~/backup
# scp 120626-home.tar.gz root@backup.local.example.com:~/backup 以下略
この実行のたびに入力するのは面倒です。さらに1つのコマンドの処理が終わるまで次のコマンドを実行できないため効率がよくありません。このような繰り返し行う処理を自動化するための手段としてシェルスクリプトを書いて実行させる方法があります。先ほどの一連の処理を system-backup.sh という名前のファイルを作成して書き込み、system-backup.sh を実行することでファイルに書き込んだコマンドを順に実行します。
#!/bin/bash
tar cvzf 120620-etc.tar.gz /etc
tar cvzf 120620-home.tar.gz /home
scp 120626-etc.tar.gz root@backup.local.example.com:~/backup
scp 120626-home.tar.gz root@backup.local.example.com:~/backup
9.2 プログラミング
コンピュータに対して、指示を与え順番に実行させる機能を、プログラムと言います。そのプログラムを作成することをプログラミングをいいます。今まで学習したコマンドを、条件分岐や繰り返しなど制御機能を加え実行する事ができます。これをシェルスクリプトといいます。
9.2.1 プログラムの例
プログラムという言葉を聞いて、最初に思いつくのは、運動会や演劇会のプログラムかもしれません。また、新聞に掲載されているテレビ番組表もプログラムです。何かが順序立てて進むものを、プログラムといいます。
9.2.2 プログラムの要素
どのプログラムでもいくつかの重要な4つの構成要素があります。
・順次実行 ・条件分岐 ・繰り返し ・サブルーチン
9.3 シェルスクリプト
シェルスクリプトを作成して実行する手順を紹介します。
9.3.1 シェルスクリプトの作成
lsdate.sh というファイルを作成します。
$ vi lsdate.sh
以下のようなスクリプトを記述して、保存終了して下さい。1行目に #!/bin/bash と記述しました。利用するシェルの種類とそのコマンド位置を記述します。シェルには数種類ありますが今回 bash を使用します。
#!/bin/bash
ls
date
シェルの指定
1 行目に#!/bin/bash と記述しました。ファイルの 1 行目には、利用するシェルの種類とそのコ マンド位置を記述します。シェルには数種類ありますが、今回は bash を使用します。 1 行目に利用するシェルを指定、2 行目以降に実行するコマンドを 1 行ずつ入力していきます。
パーミッションの変更
作成したシェルスクリプトを実行するには、パーミッションを変更してファイルの実行権限をつける必要があります。 ls コマンドでファイルのアクセス権限を確認します。
$ ls -l lsdate.sh
-rw-rw-r– 1 vagrant vagrant 20 12月 9 15:17 lsdate.sh
chomd コマンドで実行権限を付与します。
$ chmod u+x lsdate.sh
$ ls -l lsdate.sh
-rwxrw-r– 1 vagrant vagrant 20 12月 9 15:17 lsdate.sh
実行してみます。 ./ というのはパス指定です。意味は「カレントディレクトリにある( lsdate.sh を実行せよ)」という事です。ls や cp を実行するときは、パスが通っているのでパス指定の必要はありません。ls コマンドと date コマンドが順に実行された事がわかります。
$ ./lsdate.sh
lsdate.sh
2018年 12月 10日 月曜日 02:05:15 CET
./というのはパス指定です。意味は「カレントディレクトリにある (lsdate.sh を実行せよ)」とい うことです。ls や cp を実行するときは、パスが通っているので、このようなパス指定は必要ありません。今回は、カレントディレクトリにある特定のシェルスクリプトを実行させるために、パス指 定しました。lsdate.sh の中に記述された、ls コマンドと date コマンドが順に実行されたことがわかります。
9.3.2 コメント
コメントとは、プログラム上に書く注釈のことです。シェルの場合は # で始まる行がコメントとして認識され、プログラムの実行時はコメントは無視されます。プログラマが記述したプログラムがどういった処理をするのか記述したり、一時的に特定の処理を無効化(コメントアウト)する場合に利用します。
実習: コメントがあるスクリプトの実行
$ vi lsdate.sh
#!/bin/bash
ls
#date
シェルスクリプトを実行。date コマンドの出力がなくなったのがわかります。
$ ./lsdate.sh
lsdate.sh
9.3.3 echo コマンド
echo コマンドは引数で与えられた文字列を標準出力に出力するコマンドです。-n オプションがある時改行されません。
$ echo Message test
Message test
$ echo -n Message test
Message test[vagrant@localhost ~]$
9.3.4 変数
プログラミングをする上で、非常に重要な考え方が、変数です。変数は、簡単に言うと「ハコ」で、中に数値や文字列が入ります。変数の代入は「=」を使って行ない、参照は「 $ 」をつけて行ないます。
実習: シェル変数の作成
シェル変数 abc に値を設定し、echo コマンドで内容を確認してみましょう。
$ abc=123
$ echo $abc
123
bash では、一次元の配列変数を使用することができます。要素は角括弧 [] で囲みます。配列変数の内容を表示する場合は、$ の後ろに波括弧 {} で配列変数を囲みます。
$ abc[0]=123
$ abc[1]=456
$ echo ${abc[0]}
123
$ index=1
$ echo ${abc[$index]}
456
シェル変数と環境変数
シェルには、2種類の変数があります。シェル変数と環境変数です。シェル変数は、実行しているシェル内部でのみ有効です。環境変数は、そこから実行されたコマンド内でも有効になります。
実習: 環境変数の作成
export コマンドを使って、環境変数を作成します。1つ目のコマンドでは abc という環境変数を作成しています。abc には値を代入していません。2つ目のコマンドでは xyz という環境変数を作成しています。xyz には 234 を代入しています。
$ export abc
$ export xyz=234
2つのスクリプトBBB.sh と CCC.sh を使って、シェル変数と環境変数の動作の違いについて確認。
$ vi BBB.sh
$ cat BBB.sh
#!/bin/bash
xxx=123 # シェル変数 xxx に 123 を代入する
export yyy=234 # 環境変数 yyy に 234 を代入する
echo xxx=$xxx in BBB.sh # 変数 xxx の値を表示する
echo yyy=$yyy in BBB.sh # 変数 yyy の値を表示する
./CCC.sh # CCC.sh を実行する
$ vi CCC.sh
$ cat CCC.sh
#!/bin/bash
echo xxx=$xxx in CCC.sh # 変数 xxx の値を表示する
echo yyy=$yyy in CCC.sh # 変数 yyy の値を表示する
$ ./BBB.sh
-bash: ./BBB.sh: 許可がありません
$ chmod u+x BBB.sh
$ chmod u+x CCC.sh
$ ./BBB.sh
xxx=123 in BBB.sh
yyy=234 in BBB.sh
xxx= in CCC.sh
yyy=234 in CCC.sh
シェルスクリプト CCC.sh の中で xxx の値は表示されません。シェル変数は引き継がれないからです。一方で yyy は環境変数なので CCC.sh まで引き継がれるため、値が表示されます。
9.3.5 read コマンド
read コマンドは、標準入力からデータを読み込みます。すでに変数にデータが入っていた場合、新しいデータに上書きされます。
実習: read コマンドの実行
$ echo $abc
123
$ read abc
aaabbbccc
$ echo $abc
aaabbbccc
9.3.6 シェル変数
シェル変数の一覧を表示する場合は、set コマンドを利用します。削除する場合は、unset を利用します。
実習: シェル変数の一覧の表示と削除
$ set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=() 以下略
$ set | grep ^abc
abc=([0]=”aaabbbccc” [1]=”456″)
$ unset abc
$
9.3.7 環境変数
現在の環境変数の一覧を表示する場合は、env コマンドを利用します。登録済みの環境変数を削除するときは、unset コマンドを利用します。
実習: 環境変数の一覧の表示と削除
$ env
XDG_SESSION_ID=3
HOSTNAME=localhost.localdomain
TERM=xterm-256color
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.0.2.2 63387 22
SSH_TTY=/dev/pts/0
USER=vagrant
LS_COLORS=rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;以下略
$ ABC=123
$ export ABC
$ env | grep ^ABC
ABC=123
$ unset ABC
$ env | grep ^ABC
$
9.3.8 引用符
シェルスクリプトにおいて、文字列を引用符で囲むことが出来ます。入れ子が可能です。
‘ シングルクォート ‘ 全て文字列として認識されます。
” ダブルクォート “ $ 付き変数は展開された文字列になります。
` バッククォート ` バッククォートで囲まれた文字列はコマンドとして解釈されます。
実習: 引用符の動作確認
$ ABC=123
$ echo ‘Value of ABC is $ABC.’
Value of ABC is $ABC.
$ echo “Value of ABC is $ABC.”
Value of ABC is 123.
$ XYZ=`date`;
$ echo “It is $XYZ now.”
It is 2018年 12月 12日 水曜日 08:38:48 CET now.
9.3.9 引数
シェルスクリプトは、実行時にオプションを引数として参照することが出来ます。引数は $1,$2 …など $ の後に引数の番号を指定することで参照出来ます。
実習: 引数出力の確認
$ vi args.sh
$ cat args.sh
#!/bin/bash
echo ‘$1’ $1;
echo ‘$2’ $2;
echo ‘$3’ $3;
echo ‘$0’ $0;
echo ‘$#’ $#;
echo ‘$@’ $@;
echo ‘$?’ $?;
$ ./args.sh red green yellow
-bash: ./args.sh: 許可がありません
$ chmod u+x args.sh
$ ./args.sh red green yellow
$1 red 第1引数
$2 green 第2引数
$3 yellow 第3引数
$0 ./args.sh プログラムそのもの
$# 3 引数の個数
$@ red green yellow 引数値の全て
$? 0 プログラムが正しく(0又は1)終了したかエラーかの数字
9.3.10 shift 文
shift コマンドは、引数の順序をずらします。$2 が $1に、$3 が $2 に・・・になります。
実習: shift コマンドの確認
$ vi argsshift.sh
$ cat argsshift.sh
#!/bin/bash
echo ‘$1:’ $1;
echo ‘$2:’ $2;
echo ‘$3:’ $3;
shift
echo ‘$1:’ $1;
echo ‘$2:’ $2;
$ ./argsshift.sh red green yellow
-bash: ./argsshift.sh: 許可がありません
$ chmod u+x argsshift.sh
$ ./argsshift.sh red green yellow
$1: red
$2: green
$3: yellow
$1: green
$2: yellow
9.3.11 エスケープシーケンス
プログラミング言語には、特別な扱いを受ける文字(メタキャラクター)があります。例えば、echo コマンドで、「 Value of ABC is “123”. 」のように ” ダブルクオート ” を出力する方法を考えてみます。
$ ABC=123
$ echo “Value of ABC is “$ABC”.”
Value of ABC is 123.
($ABC を “” で囲みましたが、”” が表示されません)
$ echo “Value of ABC is \”$ABC\”.”
Value of ABC is “123”.
(表示したい ” の直前に「 \ 」を付けることで ” を表示できます。 「 ¥ 」でも良いです)
他にも方法があります。
$ echo “Value of ABC is ‘$ABC’.”
Value of ABC is ‘123’. これは教科書通りですとこうなります。
$ echo ‘Value of ABC is “‘$ABC'”.’
Value of ABC is “123”. 入れ子にしたらこうなりました。
$ echo “Value of ABC is \$ABC.”
Value of ABC is $ABC.
(ダブルクオートで囲んだ文字列内で「 $ 」をそのまま表示したい場合直前の「 \ 」でも可能です)
バックスラッシュは改行コードにも有効です。下記の例は途中でバックスラッシュを改行しても無視され同じ結果になります。シェルスクリプト内でも使えます。
$ echo “I am a cat. As yet I have no name.”
I am a cat. As yet I have no name.
$ echo “I am a cat.\
> As yet I have no name.”
I am a cat.As yet I have no name.
$ vi escape.sh
$ cat escape.sh
#!/bin/bash
echo “I am a cat. \
As yet I have no name.”
$ ./escape.sh
-bash: ./escape.sh: 許可がありません
$ chmod u+x escape.sh
[vagrant@localhost ~]$ ./escape.sh
I am a cat. As yet I have no name.
echo コマンドでエスケープした文字を解釈するオプション -e で試してみます。
$ echo -e “I am a cat. \nAs yet I have no name\041”
I am a cat.
As yet I have no name!
9.3.12 source コマンド
実行権限がないものでも source コマンドを使えば実行できるようになります。
$ vi set.sh
$ cat set.sh
#!/bin/bash
abc=xyz
echo $abc
$ ./set.sh
-bash: ./set.sh: 許可がありません
$ source set.sh
xyz
9.4 条件分岐
プログラミングでは、条件にそって挙動を切り替える「条件分岐」を利用します。
9.4.1 if 文
書式 (if 文は fi で終わります)
if 条件式1
then
実行文1
else
実行文2
fi
9.4.2 ファイル属性の確認
-f の部分がファイル属性の演算子にあたります。 -f はファイルであるかの判定を行うので、if 文全体で、「パスがファイルであれば真の値を返す」という条件式になります。
サンプル文
$ vi ifsample.sh
$ cat ifsample.sh
#!/bin/bash
if test -f testscript
then
source ./testscript
else
echo “testscript file not exit”
fi
$ ./ifsample.sh
-bash: ./ifsample.sh: 許可がありません
[vagrant@localhost ~]$ chmod u+x ifsample.sh
[vagrant@localhost ~]$ ./ifsample.sh
testscript file not exit
なお、test コマンドは [ ] を使って記述することもできます。
$ cat ifsample.sh
#!/bin/bash
if [ -f testscript ] ; then
../testscript
else echo “testscript file not exit”
fi
$ ./ifsample.sh
testscript file not exit
9.4.3 複数の条件を重ねる
条件分岐の場合、複数の条件を重ねることができます。
論理積( =AND )
条件 A ” かつ ” 条件 B が成立。 -a を用いる場合と、 && を用いる場合があります。
[条件A -a 条件B -a 条件C]…
[条件A] && [条件B] && [条件C]…
論理和( =OR )
条件 A ” もしくは ” 条件 B が成立。 -o を用いる場合と、 || を用いる場合があります。
[条件A -o 条件B -o 条件C]…
[条件A] || [条件B] || [条件C]…
9.4.4 一対多(いちたいた)の条件分岐
シェルスクリプトでは、cace 文が用意されており、一対多の分岐が記述できます。値はパイプ記号 ( | ) で区切って複数指定することができます。
書式
case 変数 in
値A)
処理1;;
値B)
処理2;;
esac
実行例
$ vi case.sh
$ chmod u+x case.sh
$ cat case.sh
#!/bin/bash
case $1 in
a|A)
echo “input a or A into arg1”;;
b|B)
echo “input b or B into arg1”;;
esac
$ ./case.sh a
input a or A into arg1
$ ./case.sh B
input b or B into arg1
また、どの値にもマッチしなかった場合の処理を記述するには、値にアスタリスク( * )を用います。
$ vi defaultcase.sh
$ chmod u+x defaultcase.sh
$ cat defaultcase.sh
#!/bin/bash
case $1 in
1)
echo “input 1 into arg1”;;
2)
echo “input 2 into arg1”;;
*)
echo “input something value which without 1 and 2 into arg1”;;
esac
$ ./defaultcase.sh test
input something value which without 1 and 2 into arg1
$ ./defaultcase.sh 1
input 1 into arg1
9.5 繰り返し
プログラミングにおいて、条件分岐と同じくらい重要な機構が、この繰り返しです。同じ処理を繰り返し行い、ある条件が成立してときに終了するという形式が用いられています。
9.5.1 for 文
書式
for 変数 in 値のリスト
do
処理
done
$ for i in a b c
> do
> echo $i
> done
a
b
c
以下のように i に ls の実行結果を代入してループが実行されます。
$ for i in `ls`
> do
> echo $i
> done
BBB.sh
CCC.sh
LinuxCertification
age.sh
args.sh
argsshift.sh
base.sh
case.sh
(お使いの環境によって表示が違います)
9.5.2 while/until 文
while 文は、条件が成立している間ループを繰り返す(条件が成立しなくなったら終了)。until 文はそれの反対で、条件が成立していない間ループを繰り返す(条件が成立したら処理を終了)という用途に用いられます。
書式
while 条件式
do
処理
done
until 条件式
do
処理
done
実行例
$ cat loop.sh
#!/bin/bash
count=1
while [ $count -le 10 ]
do
echo “この処理は$count回数実行されました”
count=`expr $count + 1`
done
count=1 で、カウンタ用の変数count に初期値1を設定します。while [ $count -le 10 ] で、シェル変数 count が10以下の間、処理を繰り返します。
$ ./loop.sh
この処理は1回数実行されました
この処理は2回数実行されました
この処理は3回数実行されました
この処理は4回数実行されました
この処理は5回数実行されました
この処理は6回数実行されました
この処理は7回数実行されました
この処理は8回数実行されました
この処理は9回数実行されました
この処理は10回数実行されました
9.5.3 select 文
select 文は、ユーザに対し数値による入力を促します。 1−3を入力すると、do ~ done 内部が実行されます。
$ select name in “apple” “banana” “orange”
> do
> echo $name
> done
1) apple
2) banana
3) orange
#? 1
apple
#? 3
orange
#?
(Ctrl + c で中止)
9.5.4 繰り返しの制御
break や continue を用いることで、繰り返しを制御することができます。break は繰り返しを終了して、continueは繰り返しに戻る役割があります。
$ cat sample.sh
#!/bin/bash
while true
do
echo “Continue? (y/n)”
read input
case $input in
n) break
;;
y) continue
;;
*) echo “Please input y or n.”
;;
esac
done
$ ./sample.sh
Continue? (y/n)
y (y を入力)
Continue? (y/n) (繰り返しの先頭に戻る)
a (y,n 以外を入力)
Please input y or n.
Continue? (y/n)
n (n を入力)
(繰り返しを終了する)
9.6 サブルーチン
プログラミングをする上で、一連の処理をまとめて、再利用できるようにしたものを、サブルーチンと言います。シェルスクリプトでは関数と呼ばれています。
9.6.1 関数
関数は、引数とよばれるデータを与え、処理をして結果を返すという機能の集まりです。
書式(両者とも働きは同じです)
function 関数名
{
処理
}
function()
{
処理
}
9.6.2 return 文
シェルスクリプトの関数で、結果を返すときは return 文を実行します。
return 変数名
9.7 実際のシェルスクリプト
CentOS 7の起動スクリプトを例にあげます。他のディストリビューションおよび CentOS のバージョンによっては若干の内容が異なる場合があります。
9.7.1 起動スクリプト
今回は /etc/init.d/network を参考にします。CentOS 7 ではサービスの起動は SysV init から systemd に置換えられましたが、/etc/init.d に SysV init 後方互換のスクリプトがあります。
$ cat -n network
#! /bin/bash
#
# network Bring up/down networking
17 . /etc/init.d/functions
/etc/init.d/functions というファイルを読み込みます。 /etc/init.d/functions は /etc/ の中に入っている様々なシェルスクリプトが共通して利用できる便利な関数が入っています。それを有効にするために、最初の処理として17行目が実行されます。
$ cat functions
33 # if the ip configuration utility isn’t around we can’t function.
34 [ -x /sbin/ip ] || exit 1
34行目は、下記の書式に基づいた動作をします。
コマンド1 && コマンド2
コマンド1が正常に終了した場合、コマンド2を実行
コマンド1 || コマンド2
コマンド1が異常終了した場合、コマンド2を実行
コマンド1 && コマンド2 && … && コマンドN || コマンドY
コマンド1から実行し、正常終了する限り && の右に進み、異常終了した段階でコマンドYを実行
最初の文字 [ は、/usr/bin ディレクトリにあるコマンドで、test コマンドと同じ機能を持ちます。また、bash のビルトインコマンドとしても存在します。
$ which \[
/usr/bin/[
書式に従い、34行目は [ -x /sbin/ip ] が異常に終了した場合に 「 || 」の右側のコマンド「 exit 1 」を実行します。正常に終了した場合は次の行に進みます。つまり、/sbin/ip が実行可能なファイルとして存在すれば、処理を進めますが、/sbin/ip を実行できない条件では異常として終了します。exit の後に続く数値は、シェルスクリプトの終了コードです。終了コードは親プロセスに返すのでリターンステータスとも呼ばれます。通常はスクリプトが正常に終了する場合は 0 を、それ以外は特殊変数「 ? 」に格納され「 $? 」にて参照することができます。
if test ! -x /sbin/ip : then
exit 1
fi
64~67行目
#tell NM to reload its configuration
if [ “$(LANG=C nmcli -t –fields running general status 2>/dev/null)” = “running” ];then
nmcli connection reload
fi
nmcli コマンドの前にLANG=C をつけています。Linux は、国際化された OS で言語設定( locale )によって、出力によって、出力メッセージの言語を切り替えることができます。上記では、nmcli -t –fields running general stautsu 2 の結果が running であるか否かで分岐していますが利用者の言語設定によってコマンドの結果文字列が変わってしまうのを回避するために、このコマンド実行でのみ強制的に LANG=C に設定しています。
(LANG に POSIX のでデフォルトロケールの C を指定した場合)
$ LANG=C nmcli -t –fields running general status 2
running
(LANG にイタリア語のロケールの it_IT を指定した場合)
$ LANG=it_IT nmcli -t –fields running general status 2
in esecuzione
9.7.2 関数のシェルスクリプト
/etc/init.d/functions というファイルがあります。/etc/init.d/network の17行目でも説明したとおり、シェルスクリプトの便利な関数を集めたシェルスクリプトです。
is_ignored_file() {
case “$1” in
*~ | *.bak | *.orig | *.rpmnew | *.rpmorig | *.rpmsave)
return 0
;;
esac
return 1
}
is_ignored_file() という関数は、 /etc/init.d/network の中で無視したいファイル名に該当するかどうかのチェックを行っており、引数の1つ目( $1 )にファイル名が代入されます。case 文で引数に格納されたファイル名が *~,*.bak,*.orig ,*.rpmnew,*.rpmorig ( * は0文字以上の任意の文字列をいまいします)のいずれかの条件に該当していれば 0 (真)を返し、該当していなければ 1 (偽)を返します。関数の利用は、呼ばれているプログラムの機能を一括で更新できるという利点があることを理解してください。
9.8 デバック
作成したプログラムが思ったように動作しない場合、どこに問題があるのか調べる必要があります。これをデバックと言います。
9.8.1 sh コマンド
sh 自身はシェルを起動するコマンドですが、-x オプションを付けて引数にシェルスクリプトを指定すると、コマンドや変数の中身を表示しながらスクリプトを実行します。
$ sh -x ./sample.sh
+ true
+ echo ‘Continue? (y/n)’
Continue? (y/n)
+ read input
y
+ case $input in
+ continue
+ true
+ echo ‘Continue? (y/n)’
Continue? (y/n)
+ read input
n
+ case $input in
+ break
9.9 章末テスト
(1)実行結果が解になるように、変数 “LPI” に入力した値を出力しなさい。
$ LPI=linux
$ echo ( )
linux
(2)以下のスクリプトの空欄を埋め、カレントディレクトリにファイル lpi.txt が存在しているか確認するスクリプトを完成させなさい。
$ cat lpitext.sh
#!/bin/bash
if [ -f lpi.txt ]; then
echo file exists
( )
echo file does not exists
( )
(3)以下のスクリプトの空欄を埋め、カレントディレクトリ内の全てのファイル(サブディレクトリを除く)の種類を表示するスクリプトを完成させなさい。
#!/bin/bash
for i in `ls`
do
if [ ! -d $i ]; then
file $i
fi
( )
(4)次の動作をするシェルスクリプトを書きなさい。
1. 実行すると、age: として年齢の入力を促される。
2. 20以上の値を入れると ‘ you can dorink ‘ と出力される。
3. 20未満の値を入れると ‘ you cannot dorink ‘ と出力される。
(5) bash で、シェルスクリプトの中身を表示しながら実行(デバック)するにはどのようにしたらよいか答えなさい。
テキストと問題集の購入は下記の画像をクリックして下さい。
章末テスト解答
(1)$LPI
(2)else, fi
(3)done
(4)
#!/bin/bash
echo -n “How old are you? > ”
read age
export age
if [ $age -ge 20 ]; then
echo “you can drink.”
else
echo “you can not drink.”
fi
(5)sh -x コマンドを使う