Linux(Linux Essentials)3‐3.シェルスクリプトとテキストエディタ

今回紹介するのは以下
シェルスクリプトについて(sourceコマンド、bashコマンド、for文、など)
テキストエディタとviコマンド






シェルスクリプトについて(sourceコマンド、bashコマンド、for文、など)
シェルスクリプトの説明。
→1行目にシェバン(「#!/bin/bash」など)が記述されている。
→実行権(x)ビットを設定することでコマンドとして実行できる。


・終了ステータスの説明。
→コマンドが正常終了した場合:0
→コマンドが異常終了した場合:1~255


・sourceコマンド:指定したシェルスクリプトを読み込み、現在のシェルで実行する
スクリプトで設定した変数はシェル変数として現在のシェルで参照される。
 また、現在のシェルに設定しているシェル変数もスクリプトで参照される。


bashコマンド:シェルを起動してシェルスクリプトを実行する
スクリプトで設定した変数はスクリプト内(起動したシェル内)で完結する。
 現在のシェルに設定しているシェル変数もスクリプトへ反映されない


シェルスクリプトのfor文の文法

for 変数名 in 値のリスト
do
 処理
done



例:Bashシェルスクリプトの1行目に記述する内容として、正しいものはどれか。
→#!/bin/bash


例:シェルスクリプトにおいて、変数varに文字列「Linux Essentials」を代入するコマンドライン
→var="Linux Essentials"
※変数と"="、値の間にスペースを入れない
※変数を参照する際は「$」を使用する。


例:現在のシェルにシェル変数「TEST」が設定されている。
変数TESTの値をシェルスクリプト「test.sh」内で扱いたい場合、正しい方法は。
スクリプトの実行時に「source test.sh」とする
exportコマンドを用いて変数「TEST」を環境変数にする


例:シェルスクリプト「script.sh」には以下のようにパーミッションが設定されている。

$ ls -l script.sh
-rw-r--r-- 1 user01 user 236 Aug 20 16:57 script.sh

このスクリプトの実行方法として、正しいものはどれか。
bash script.sh
source script.sh
bashコマンド または sourceコマンドの引数に渡して実行する。
※他にも実行権を付与して実行できる。


例:シェルスクリプト「test.sh」は以下の内容である。

#!/bin/bash
echo $TEST

次のコマンドを実行した結果はどれか。なおスクリプト「test.sh」には実行権が与えられているものとする。

$ TEST="test"
$ ./test.sh

→何も出力されない
スクリプトを実行する直前にシェル変数TESTへ値を代入しているが、この値はシェルスクリプトへは反映されない。


例:シェルスクリプト「sample.sh」の実行方法として正しいもの。
なお、「sample.sh」には実行権のビットが設定されているものとする。
./sample.sh
bash sample.sh


例:シェルスクリプト「script.sh」には以下のようにパーミッションが設定されている。

$ ls -l script.sh

  • rwxr-xr-x 1 user01 user 236 Aug 20 16:57 script.sh

このスクリプトの実行方法として、正しいものはどれか。
./script.sh
bash script.sh


例:スクリプト「script.sh」を実行したところ、以下のようにエラーが表示された。

$ ./script.sh
-bash: ./script.sh: Permission denied

「script.sh」を正しく実行する手段として正しいものはどれか。
→sourceコマンドの引数に「script.sh」を指定する
bashコマンドの引数に「script.sh」を指定する
→「script.sh」に実行権を与える


例:以下はループ処理を行うシェルスクリプトである。下線部に当てはまるコマンドはどれか。

______ text in *.txt
do
cp $text $text.cp
done

→for


例:シェルスクリプトで「カレントディレクトリ内の全てのファイル名を表示する」という繰り返し処理を行う処理。

for f in ./*
do
 echo $f
done



例:カレントディレクトリに「file01」「file02」「test01.txt」「test02.txt」の4ファイルがある。
以下のシェルスクリプトを実行したとき、画面に出力される結果として正しいものはどれか。

#!/bin/bash

for f in file*
do
 echo $f
done

→「file01」と「file02」
シェルスクリプトでは、構文「for」を用いて繰り返し処理を行うことができる。


例:以下はシェルスクリプト「script.sh」の内容である。

#!/bin/bash
echo "$2"

bash script.sh test sample」と実行した場合、結果として表示される物。
→sample
※引数の数は「$#」、引数は先頭から「$1」「$2」などと参照できる。この場合は"$2"なので2番目の引数であるsampleが表示される


例:カレントディレクトリにファイル「test01.txt」「test10.txt」「script01.sh」「script02.sh」がある。
以下のシェルスクリプトを実行したときの実行結果として正しいもの。

#!/bin/bash

for f in *.sh
do
 a=$f
done
echo $a

→script02.sh
※設問では、ファイル名の末尾が「.sh」のファイルを変数「f」へ代入して一つずつ処理している。
※変数fの内容を変数aへ代入していますが、aの内容はループするたびに上書きされるため、最終的には文字列"script02.sh"が代入されている。


テキストエディタとviコマンド
Linuxで利用可能なテキストエディタ
→vi
→nano
Emacs


・:w [ファイル名]
保存。ファイル名を指定した場合は指定したファイルへ保存。


・:wq [ファイル名]
保存して終了。ファイル名を指定した場合は指定したファイルへ保存。


・:q
終了(ファイルへの変更があった場合は警告が表示される)。
・:q!
強制終了(ファイルへの変更があった場合でも保存されない)。


例:viにおいて、ファイル名「file.txt」で保存するコマンド。
→:w file.txt(※保存のみで終了せずに継続)


・viにおいてコマンドモードから入力モードへ切り替えるキーはどれか。
→i:カーソル位置のから入力開始。
→a:カーソル位置のから入力開始。
→o:カーソル位置の下に空白行を挿入して、その行から入力開始。


・x
カーソル位置の文字を削除するキー。


・u
→アンドゥ(ひとつ前の操作をやり直し)するキー。


・viにおいて、入力モードからコマンドモードへ切り替えるにはキー入力。
Esc